2013-09-02 6 views
6

Sto cercando di trovare le impostazioni o la politica della dimensione in modo che ogni pagina nell'istanza QToolBox occupi solo lo spazio necessario al suo contenuto. Ho provato tutto ciò che ho potuto vedere nelle proprietà sia per l'istanza che per ciascuna delle singole pagine.Con QToolBox, quale impostazione avere per la pagina solo la sua dimensione del contenuto?

Sto interpretando male la funzionalità del widget QToolBox o mancando semplicemente l'impostazione corretta?

Quello che sto per qualcosa di simile al widget a fisarmonica tipo di piegatura in Qt Creator:

enter image description here

io non riesco a ottenere questa pagina "Ordina" a prendere solo la dimensione necessaria per visualizzare il pulsante e il campo.

enter image description here

enter image description here

risposta

6

Purtroppo si può farlo direttamente perché coprirà tutto lo spazio a disposizione che i widget titolo non occupano. Puoi emulare quello che vuoi impostando uno fixed height su QToolBox se conosci l'altezza esatta della tua pagina. Ma tu, , non vuoi fare lo nella pratica.

Se si desidera il comportamento richiesto, è necessario scrivere il proprio controllo personalizzato. Non deve essere difficile. Utilizza uno QVBoxLayout e inserisci elementi di una classe personalizzata, chiamiamolo ToolItem, che è un QWidget con un titolo (forse un pulsante da mostrare/nascondere) e un altro QWidget per mostrare il contenuto che è visibile o meno.

Il seguente esempio semplifica la visibilità di ToolItem quando viene fatto clic. E solo quando sarà visibile occuperà qualsiasi spazio.

class ToolItem : public QWidget { 
public: 
    ToolItem(const QString &title, QWidget *item) : item(item) { 
    QVBoxLayout *layout = new QVBoxLayout; 
    layout->setContentsMargins(0, 0, 0, 0); 
    layout->addWidget(new QLabel(title)); 
    layout->addWidget(item);  
    setLayout(layout); 

    item->setVisible(false); 
    } 

protected: 
    void mousePressEvent(QMouseEvent *event) { 
    item->setVisible(!item->isVisible()); 
    } 

private: 
    QWidget *item; 
}; 

class ToolBox : public QWidget { 
public: 
    ToolBox() : layout(new QVBoxLayout) { 
    setLayout(layout); 
    } 

    void addItem(ToolItem *item) { 
    // Remove last spacer item if present. 
    int count = layout->count(); 
    if (count > 1) { 
     layout->removeItem(layout->itemAt(count - 1)); 
    } 

    // Add item and make sure it stretches the remaining space. 
    layout->addWidget(item);  
    layout->addStretch(); 
    } 

private: 
    QVBoxLayout *layout; 
}; 

e semplice l'utilizzo di esso:

QWidget *window = new QWidget; 
window->setWindowTitle("QToolBox Example"); 

QListWidget *list = new QListWidget; 
list->addItem("One"); 
list->addItem("Two"); 
list->addItem("Three"); 

ToolBox *toolBox = new ToolBox; 
toolBox->addItem(new ToolItem("Title 1", new QLabel("Some text here"))); 
toolBox->addItem(new ToolItem("Title 2", list)); 
toolBox->addItem(new ToolItem("Title 3", new QLabel("Lorem Ipsum.."))); 

QVBoxLayout *layout = new QVBoxLayout; 
layout->addWidget(toolBox); 

window->setLayout(layout); 
window->resize(500, 500); 
window->show(); 

Ora è possibile modificarlo per apparire come il QToolBox, se necessario.

Si prega di non esitare a porre domande di follow-up.

+0

Wow, ottimo esempio; davvero imparando molto da questo. Grazie! Sono nuovo di Qt e i layout sono stati i più difficili da ottenere in modo intuitivo. Hai impostato le relazioni qui in un modo che finalmente fa clic per me. Finalmente, sono praticamente un punter/hobbista con C++. Stai usando solo file .h qui (almeno l'ho fatto per farlo funzionare). Ho sempre usato il .cpp + .h insieme. Esiste un nome per il solo uso di .h così posso cercarlo? Ho visto qualcosa chiamato "idioma pimpl", ma non sono sicuro se questo è ciò che è. –

+0

Siete i benvenuti. :) Sì, l'ho appena messo per essere il più chiaro possibile. È possibile avere tutto in un file .h, ma in sostanza diventa solo il file di implementazione. È meglio avere file .h (con protezioni incluse) che puoi esporre all'interfaccia e poi.file cpp con l'implementazione effettiva. In alcuni casi avrai comunque qualche implementazione nei file .h, come quando usi i template. PIMPL usa ancora i file .h/.cpp. –

3

L'esempio mostrato da Qt Designer non può utilizzare uno QToolBox, che si comporta più come un widget di schede impilate visualizzando solo una singola pagina alla volta. L'esempio in Qt Designer sembra essere un QTreeWidget con un disegno o uno stile personalizzato.

Problemi correlati