我在一个QDockWidget
内有一些QWidget
s(不浮动,只能关闭)。
我在每个QDockWidget
里面都有一些小部件 - 它们的高度应该相等。
可以通过上下文菜单隐藏这些内部小部件。
我的内部小部件应该具有相同的高度。我是这样做的:
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
添加一些const元素:一些水平滚动条和一些标签......现在我的内部小部件有不同的大小。但是我必须将他们的高度设置得非常平等。
QLayout
在小部件层次结构的一个级别上列出小部件大小。如何制作高度相等的子小部件?
3个子窗口小部件与2个子窗口小部件
我设置第3和第2段的第一个策略:
但是,当我添加滚动条时:
我的5个小部件的高度等于37,37,37,28,28 ......这就是问题
答案 0 :(得分:4)
您在弹力系数方面处于正确的轨道上,但请考虑像素值而不是小比例。尝试将每个停靠窗口小部件的伸展因子设置为:
dockWidgetStretch = numChildWidgets * childWidgetMinimumHeight + scrollBarHeight;
其中childWidgetMinimumHeight
和scrollBarHeight
都以像素表示,并且都是常量。
编辑:这是一个有效的例子。您可能需要进行一些实验才能使其与您的程序一起使用,但这应该是一个良好的开端。
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();
}
答案 1 :(得分: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);
如果要隐藏已添加到布局中的任何小部件,布局将处理调整剩余可见子级的大小。