我有Qt布局系统的问题。第一张照片是我得到的,第二张是我想要的。 我有一个垂直分割器和两个小部件。第一个小部件具有扩展策略和伸展因子为1.第二个具有最小高度策略,minimumHeight 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);
}
答案 0 :(得分:0)
您可以看到here QSizePolicy::Minimum
已GrowFlag
,而您需要ShrinkFlag
的政策,如果您想告诉小部件,请尝试使用QSizePolicy::Maximum
缩小。
答案 1 :(得分:0)
QSplitter
有一些非常奇怪的行为,但您可以通过使用setSizes(const QList<int>&)
功能在第二个屏幕截图中实现所需的外观。文档here。
关于如何处理尺寸的文件有点不清楚(IMO),但以下引用是最重要的:
拆分器小部件的整体大小不受影响。相反,任何额外/缺失的空间都会根据大小的相对权重分布在小部件中。
您可以利用这一点,结合您的第二个小部件的最小100像素大小来实现一个比例(即顶部小部件比底部大50%的3:2)或强制第二个小部件到它的最小尺寸。
要达到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()
调用中提供的尺寸之间的比例来分配可用空间。