2013-09-02 9 views
6

私のQToolBoxインスタンスの各ページがそのコンテンツに必要な領域だけを占有するように、設定またはサイズポリシーを見つけようとしています。インスタンスと個々のページの両方のプロパティで見ることができるすべてを試しました。QToolBoxでは、ページのコンテンツサイズのみを設定しますか?

私はQToolBoxウィジェットの機能を誤解していますか、または正しい設定が欠落していますか?私は何のために行くのですがQtの創造主でアコーディオンの折り畳み型のウィジェットのようなものである

enter image description here

私は必要なサイズだけを取るために、この「ソート」ページを取得するように見えることはできませんボタンとフィールドを表示します。

enter image description here

enter image description here

答えて

6

それがタイトルのウィジェットが占有していないことを、すべての利用可能なスペースにまたがるますので、残念ながら、あなたは直接これを行うことはできません。ページの正確な高さを知っている場合はfixed heightQToolBoxに設定して、あなたが望むものをエミュレートすることができます。しかし、あなたはではありません実際にそれをしたいです。

あなたが求める動作をしたい場合は、独自のカスタムコントロールを作成する必要があります。それは難しいことではありません。 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; 
}; 

そして、それの簡単な使い方。

お気軽にフォローアップの質問をしてください。

+0

うわー、素晴らしい例。本当にたくさんのことを学んでいます。ありがとう!私はQtが新しく、レイアウトは直感的に理解しにくいものでした。あなたはここで私のために最終的にクリックする方法で関係を設定しました。最後に、私はC++のかなりの賭け手/愛好家です。ここでは.hファイルのみを使用しています(少なくとも私はこれを動作させた)。私は常に.cpp + .hを一緒に使用してきました。ちょうど.hを使用するための名前がありますので、私はそれを見ることができますか?私は「ピンプルイディオム」と呼ばれるものを見ましたが、それがこれであるかどうかはわかりません。 –

+0

あなたは大歓迎です。 :)ええ、私はこれをできるだけ明確にするようにしています。あなたは.hファイル内のすべてを持つことができますが、基本的には実装ファイルになります。 .hファイル(インクルードガードを含む)を持っていると、インターフェイスを公開することができます。 –

3

Qt Designerから表示される例では、一度に1ページずつしか表示されないスタック型タブウィジェットのように動作するQToolBoxを使用していない可能性があります。 Qt Designerの例では、カスタム図面またはスタイリングのあるQTreeWidgetが表示されます。