2013-05-16 41 views
2

我使用Qt布局系统问题。第一张照片是我得到的,第二张是我想要的。 我有一个垂直分离器和两个小部件。第一器具已扩大政策和拉伸系数为1。第二个具有最小高度的政策,minimumHeight 100和拉伸系数0开始后的结果应该是第二张图片,但实际上它是第一张照片,我需要手动将分流下来。问题在哪里?Qt的布局系统(的QTextEdit还没有最小尺寸)

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

} 

回答

0

,你可以看到hereQSizePolicy::MinimumGrowFlag,而你需要ShrinkFlag政策,尝试,如果你想告诉小部件收缩到使用QSizePolicy::Maximum代替。

+0

我想GrowFlag政策,但只能通过分光器在用户想要的,这就是为什么我设置QSizePolicy ::最低和拉伸系数为0,那么如果有其他小部件QSizePolicy ::扩展和的stretchFactor> 0,它得到整个“未使用“的空间,所以我的TextEdit应该只有100px的高度。 – Krab

+0

启动屏幕应该类似于第二画面 – Krab

+0

分级式> setStretchFactor(0,1); splitter-> setStretchFactor(1,0); 这些行看衰 – Shf

0

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

的文件是关于大小是如何处理的有点不清楚(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()调用中提供的大小之间的比例来分配可用空间。