2

我对 Qt 布局系统有疑问。第一张照片是我得到的,第二张是我想要的。我有一个垂直分离器和两个小部件。第一个小部件的扩展策略和拉伸因子为 1。第二个有最小高度策略,最小高度 100 和拉伸因子 0。开始后的结果应该是第二张图片,但实际上它是第一张图片,我需要手动向下拖动拆分器。问题出在哪里?

我得到了什么

我想要的是

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QSizePolicy sp;

    QSplitter * splitter = new QSplitter(Qt::Vertical);
    splitter->setHandleWidth(1);
    splitter->setChildrenCollapsible(false);
    sp.setHorizontalPolicy(QSizePolicy::Expanding);
    sp.setVerticalPolicy(QSizePolicy::Expanding);
    splitter->setSizePolicy(sp);

    QWidget * topWidget = new QWidget(splitter);
    sp.setVerticalStretch(1);
    topWidget->setSizePolicy(sp);
    topWidget->setMinimumHeight(200);

    QWidget * bottomWidget = new QWidget(splitter);
    sp.setVerticalStretch(0);
    bottomWidget->setSizePolicy(sp);


    QTextEdit * edit = new QTextEdit();
    edit->setFrameStyle(QFrame::NoFrame);
    edit->setMinimumSize(0, 100);
    sp.setVerticalPolicy(QSizePolicy::Minimum);
    edit->setSizePolicy(sp);

    QVBoxLayout * bottomWidgetLayout = new QVBoxLayout(bottomWidget);
    bottomWidgetLayout->addWidget(edit);

    bottomWidget->setLayout(bottomWidgetLayout);

    splitter->setStretchFactor(0, 1);
    splitter->setStretchFactor(1, 0);
    this->centralWidget()->layout()->addWidget(splitter);

}
4

2 回答 2

0

QSplitter在尺寸方面有一些非常奇怪的行为,但您可以通过使用该setSizes(const QList<int>&)功能在第二个屏幕截图中实现您想要的外观。文档在这里

关于如何处理尺寸的文档有点不清楚(IMO),但以下引用是最重要的:

拆分器小部件的整体大小不受影响。相反,任何额外/缺失的空间都会根据尺寸的相对权重分布在小部件之间。

您可以利用这一点,结合您的第二个小部件的最小尺寸 100 像素来实现比例(即 3:2,顶部小部件比底部大 50%)或强制第二个小部件为其最小尺寸.

要实现大约 3:2 的比例,请将其代替两个setStretchFactor()调用:

QList<int> sizes;
sizes << 300 << 200;
splitter->setSizes(sizes);

要强制第二个小部件的最小尺寸为 100 像素,请改用:

QList<int> sizes;
sizes << 100 << 1;  //Really, the first size could be any large value you choose
splitter->setSizes(sizes);

无论哪种情况,您的窗口实际上有多大都没有关系,因为 Qt 将根据您在setSizes()调用中提供的大小之间的比率分配可用空间。

于 2013-09-10T22:14:50.850 回答
0

正如您在此处 QSizePolicy::Minimum看到的那样GrowFlag,虽然您需要策略,但如果您想告诉小部件缩小,请ShrinkFlag尝试使用。QSizePolicy::Maximum

于 2013-05-16T22:19:01.453 回答