2012-04-20 53 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