Qt布局系统(QTextEdit没有最小尺寸)

时间:2013-05-16 22:04:52

标签: c++ qt

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

What i get

What i want

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);

}

2 个答案:

答案 0 :(得分:0)

您可以看到here QSizePolicy::MinimumGrowFlag,而您需要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()调用中提供的尺寸之间的比例来分配可用空间。