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.
fonte
2013-09-02 22:02:42
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 è. –
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. –