2013-05-16 43 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()調用中提供的大小之間的比例來分配可用空間。