2012-04-20 13 views
3

私はの中にQDockWidget(浮動小数点、クローズ可能)をいくつか持っています。 私はそれぞれQDockWidgetの中にいくつかのウィジェットを持っています - それらの高さは等しくなければなりません。 これらの内部ウィジェットは、コンテキストメニューから非表示にすることができます。Qtサブウィジェットの高さを等しくするにはどうすればいいですか?

私の内部ウィジェットは同じ高さである必要があります。いくつかの水平スクロールバーといくつかのラベルが...今私の内側のウィジェットが異なるサイズを持っている:私は、各QDockWidgetにいくつかのconstの要素を追加するまで

void MyDocksPanel::redistributeSpace() 
{ 
    QBoxLayout * lay = (QBoxLayout *)layout(); 
    for (int i = 0; i < lay->count(); i++) 
    { 
     QWidget * dock = lay->itemAt(i)->widget(); 
     if (dock == NULL) 
      continue; 

     int size = 0; 
     foreach(QWidget * subWidget, dock->findChildren<QWidget*>()) 
      size += subWidget->isVisible() ? 1 : 0; 

     if (dock->isVisible() && (size == 0)) 
      dock->hide(); 
     lay->setStretch(i, size); 
    } 
} 

すべてが正常に動作します:私はそれをこのように行われます。しかし、私は自分の高さを強く等しくする必要があります。

QLayoutは、ウィジェットの階層の1つのレベルにウィジェットサイズをレイアウトします。高さの等しいサブウィジェットを作成するにはどうしたらいいですか?

3サブウィジェット対2つのサブウィジェット

First picture

ストレッチ3と2を設定するには私の最初の戦略:

enter image description here

をしかし、私は、スクロールバーを追加しました:

enter image description here

私の5つのウィジェットの高さは37,37,37,28,28 ...と同じです。問題はそれです

答えて

4

あなたはストレッチファクタで正しい軌道に乗っていますが、小さな割合ではなくピクセル値の観点から考えてください。このように各ドックウィジェットの伸縮率を設定してみてください:childWidgetMinimumHeightscrollBarHeightが両方のピクセル単位で表され、両方の定数であるれる

dockWidgetStretch = numChildWidgets * childWidgetMinimumHeight + scrollBarHeight; 

EDIT:これは実際の例です。あなたのプログラムで動作させるために少し実験しなければならないかもしれませんが、これは良いスタートです。

がheader.h

#include <QtGui> 

class WidgetWith3Children : public QWidget 
{ 
public: 
    WidgetWith3Children() 
    { 
     QTextEdit *edit1 = new QTextEdit; 
     QTextEdit *edit2 = new QTextEdit; 
     QTextEdit *edit3 = new QTextEdit; 
     QScrollBar *scrollBar = new QScrollBar(Qt::Horizontal); 
     QVBoxLayout *layout = new QVBoxLayout; 
     layout->addWidget(edit1); 
     layout->addWidget(edit2); 
     layout->addWidget(edit3); 
     layout->addWidget(scrollBar); 
     setLayout(layout); 
    } 
}; 

class WidgetWith2Children : public QWidget 
{ 
public: 
    WidgetWith2Children() 
    { 
     QTextEdit *edit1 = new QTextEdit; 
     QTextEdit *edit2 = new QTextEdit; 
     QScrollBar *scrollBar = new QScrollBar(Qt::Horizontal); 
     QVBoxLayout *layout = new QVBoxLayout; 
     layout->addWidget(edit1); 
     layout->addWidget(edit2); 
     layout->addWidget(scrollBar); 
     setLayout(layout); 
    } 
}; 

class OuterWidget : public QWidget 
{ 
public: 
    OuterWidget() 
    { 
     QDockWidget *dockWidget1 = new QDockWidget; 
     QDockWidget *dockWidget2 = new QDockWidget; 
     dockWidget1->setWidget(new WidgetWith3Children); 
     dockWidget2->setWidget(new WidgetWith2Children); 
     QVBoxLayout *layout = new QVBoxLayout; 

     // 71 is the height of the minimum size hint for QTextEdit 
     // 30 is the height of a horizontal scrollbar (on my system) 
     layout->addWidget(dockWidget1, 71 * 3 + 30); 
     layout->addWidget(dockWidget2, 71 * 2 + 30); 

     layout->setMargin(0); 
     setLayout(layout); 
    } 
}; 

main.cppに

#include <QtGui/QApplication> 
#include "header.h" 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    OuterWidget w; 
    w.show(); 

    return a.exec(); 
} 
+0

QDockWidgetのヘッダーの高さとマージン* 2と、サブアイテムとスクロールバーの間隔を追加する必要がありますか? – k06a

+1

私の推測はそうです、そうすべきです。 :)しかし、それをしないで試して、それが動作するかどうかを確認してください。 – Anthony

+0

2日前に私はこの方法を試しました。失敗。私は明日もう一度お試しになります。そして私はchildWidgetMinimumHeightに問題があります - 手動でウィジェット全体のサイズを変更したいのですが... – k06a

1

私は理解しています:QDockWidgetには複数の子供とラベルが含まれています水平スクロールバーです。ラベルとスクロールバーは固定された高さでなければならず、残りの垂直スペースは子ウィジェット間で分割する必要があります。

これが正しい場合は、それぞれQDockWidgetQVBoxLayoutを追加するだけです。私は以下やったとしてあなたのウィジェットを追加します。

QDockWidget DockWidget; 
QVBoxLayout Layout = new QVBoxLayout(DockWidget); 

FixedHeightWidget.setFixedHeight(10) 
Layout.addWidget(FixedHeightWidget, 0); 
Layout.addWidget(FirstVariableHeightWidget, 1); 
Layout.addWidget(SecondVariableHeightWidget, 1); 
Layout.addWidget(ThirdVariableHeightWidget, 1); 

あなたはレイアウトに追加したウィジェットのいずれかを非表示にした場合、レイアウトは残りの可視の子をリサイズ処理します。

+0

すべての権利、しかし、私は、複数のQDockWidgetsはQVBoxLayoutをint型持っています。サブウィジェット全体のサイズは同じでなければなりません。 – k06a

+0

申し訳ありませんが、私はあなたがそこに何を意味理解しているか分からない!もう少し説明していただけますか?いくつかの種類の画像がここで本当に便利です。 – sjwarner

+0

QVBoxLayoutに3-4個のQDockWidgetsがあり、それぞれに1〜5個の子ウィジェットがあります(QVBoxLayoutも使用しています)。子ウィジェットのサイズは同じでなければなりません。 – k06a

関連する問題