2012-04-20 107 views
3

我在一個QWidget內有一些QDockWidget s(不浮動,只能關閉)。 我在每個QDockWidget裏都有一些小部件 - 它們的高度應該相等。 這些內部小部件可以通過上下文菜單隱藏。如何讓Qt subwidget高度相等?

我的內部小工具應該有相同的高度。我做這樣說:

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); 
    } 
} 

一切工作正常,直到我加入一些常量元素,每個QDockWidget:一些水平滾動條和一些唱片公司......現在我內心的部件具有不同的尺寸。但我有必要將他們的高度大致相等。

QLayout勾畫出一個小部件的層次結構的一個級別部件尺寸。我怎樣才能讓高度相等的子裝置?

3 subwidgets對2個subwidgets

First picture

我的第一個策略設置拉伸部3和2:

enter image description here

但是,當我增加了滾動條:

enter image description here

我的5個小工具的高度等於37,37,37,28,28 ...那就是問題

回答

4

你在正確的軌道上拉伸的因素,但認爲在像素值,而不是小比例的條款。嘗試每個碼頭窗口小部件的伸展因子設置爲這樣:

dockWidgetStretch = numChildWidgets * childWidgetMinimumHeight + scrollBarHeight; 

其中childWidgetMinimumHeightscrollBarHeight都以像素爲單位,且都是常數。

編輯:這是一個工作示例。您可能需要嘗試一下才能使其與您的程序一起工作,但這應該是一個好的開始。

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 2012-04-23 19:01:29

+1

我的猜測是肯定的,你應該。 :)但嘗試它沒有這樣做,看看它是否工作。 – Anthony 2012-04-23 19:04:08

+0

兩天前我試過這種方式。沒有成功。我明天再試一次。我有問題與childWidgetMinimumHeight - 我想調整整個小部件手動... – k06a 2012-04-23 19:48:54

1

只是爲了檢查我瞭解:您有一個QDockWidget其中包含多個子項以及一個標籤和一個水平滾動條。標籤和滾動條的高度應該是固定的,其餘的垂直空間應該在子部件之間分配。

如果這是正確的,所有你需要做的就是添加一個QVBoxLayout每個QDockWidget。添加小部件,因爲我已經做了如下:

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。而整個子小部件應該有相同的大小。 – k06a 2012-04-20 13:34:14

+0

對不起老兄,不知道我明白你的意思!你能再解釋一下嗎?某種形象在這裏真的很有用。 – sjwarner 2012-04-20 15:02:31

+0

我在QVBoxLayout中有3-4個QDockWidgets,每個中都有1-5個子窗口小部件(也使用QVBoxLayout)。兒童小部件應該具有相同的大小。 – k06a 2012-04-20 15:22:19