それがタイトルのウィジェットが占有していないことを、すべての利用可能なスペースにまたがるますので、残念ながら、あなたは直接これを行うことはできません。ページの正確な高さを知っている場合はfixed heightをQToolBox
に設定して、あなたが望むものをエミュレートすることができます。しかし、あなたはではありません実際にそれをしたいです。
あなたが求める動作をしたい場合は、独自のカスタムコントロールを作成する必要があります。それは難しいことではありません。 QVBoxLayout
を使用して、カスタムクラスのアイテムを入力してください。ToolItem
というタイトル(表示/非表示のボタン)を持つQWidget
と表示したり、表示しないコンテンツを表示する別のQWidget
としましょう。
次の非常に簡単クリックするとToolItem
の表示を切り替えます。そして、それが目に見えるときだけそれはどんなスペースも占有します。あなたが今、必要であれば、それはQToolBox
のように見えるように調整することができ
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();
:
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;
};
そして、それの簡単な使い方。
お気軽にフォローアップの質問をしてください。
うわー、素晴らしい例。本当にたくさんのことを学んでいます。ありがとう!私はQtが新しく、レイアウトは直感的に理解しにくいものでした。あなたはここで私のために最終的にクリックする方法で関係を設定しました。最後に、私はC++のかなりの賭け手/愛好家です。ここでは.hファイルのみを使用しています(少なくとも私はこれを動作させた)。私は常に.cpp + .hを一緒に使用してきました。ちょうど.hを使用するための名前がありますので、私はそれを見ることができますか?私は「ピンプルイディオム」と呼ばれるものを見ましたが、それがこれであるかどうかはわかりません。 –
あなたは大歓迎です。 :)ええ、私はこれをできるだけ明確にするようにしています。あなたは.hファイル内のすべてを持つことができますが、基本的には実装ファイルになります。 .hファイル(インクルードガードを含む)を持っていると、インターフェイスを公開することができます。 –