3

QDockWidget在单个QWidget. 我每个里面都有一些小部件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);
    }
}

一切正常,直到我向每个元素添加一些 const 元素QDockWidget:一些水平滚动条和一些标签......现在我的内部小部件有不同的大小。但我有必要将它们的高度设置为非常相等。

QLayout在小部件层次结构的一级上布置小部件尺寸。如何制作高度相等的子小部件?

3 个子小部件与 2 个子小部件

第一张照片

我设置延伸 3 和 2 的第一个策略:

在此处输入图像描述

但是,当我添加滚动条时:

在此处输入图像描述

我的 5 个小部件的高度等于 37、37、37、28、28 ......这就是问题所在

4

2 回答 2

4

您在拉伸因子方面处于正确的轨道上,但要考虑像素值而不是小比例。尝试将每个停靠小部件的拉伸因子设置为:

dockWidgetStretch = numChildWidgets * childWidgetMinimumHeight + scrollBarHeight;

其中childWidgetMinimumHeightscrollBarHeight都以像素表示,并且都是常数。

编辑:这是一个工作示例。您可能需要进行一些试验才能使其与您的程序一起使用,但这应该是一个好的开始。

头文件.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);
    }
};

主文件

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

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

    return a.exec();
}
于 2012-04-23T17:47:09.983 回答
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);

如果您要隐藏已添加到布局中的任何小部件,则布局将处理调整剩余可见子项的大小。

于 2012-04-20T13:00:31.507 回答