2016-06-07 975 views
3

選項尺寸策略和拉伸因子如何影響小部件的尺寸?Qt尺寸策略和拉伸因子

下面的圖像示出了三個不同佈置的窗口預覽。對於所有三個窗口(W1-W3),右側的小部件是一個QFrame小部件,其水平和垂直尺寸策略設置爲首選(這是默認設置)。水平伸縮因子設置爲。左邊的小部件是一個而QListView插件也具有設置爲優選大小策略(默認情況下,這將被展開)和水平伸展因子設置爲1

Different layouts

三個窗口的方式這兩個部件是佈局對彼此不同。

  1. (W1)上圖中左側窗口的中央控件設置爲水平佈局,導致我期望的控件的2/3大小比例,因爲拉伸因子設置爲和。
  2. (W2)這兩個小部件通過QSplitter小部件相互「連接」。中央小部件設置爲水平佈局。小部件大小的結果與W1不同,不在2/3的比例。
  3. (W3)右窗口將窗口W2中​​的QSplitter與「連接」兩個窗口小部件。 Howevert,QListView部件是QVBoxLayout的子部件。因此,QSplitter將QFrame和QVBoxLayout作爲子項目。

具體如下圖中所示的三個不同的窗口設置:

enter image description here

我有以下問題:

  • 爲什麼兩者的比值小部件在W1,W2和W3之間有什麼不同?
  • W2中的比例似乎受拉伸因素的影響,但與預期結果不同。但是W3似乎完全不受拉伸因素的影響。爲什麼會這樣?

回答

2
  1. 與關係分離器伸展因子的行爲被證明是比佈局的行爲不同:你不應該指望他們看起來是一樣的。

  2. 如果實現的話,你索賠的W2 & W3應該是相同的。你的UI文件有一個錯誤。

下面是不使用的.ui文件測試用例:

screenshot of the example

// https://github.com/KubaO/stackoverflown/tree/master/questions/layout-stretch-triad-37680657 
#include <QtWidgets> 

struct Window : public QMainWindow { 
    QWidget central; 
    QHBoxLayout layout{&central}; 
    QListView view; 
    QFrame frame; 
    Window(const QString & title) { 
     setWindowTitle(title); 
     setCentralWidget(&central); 
     view.resize(300, 300); 
     view.setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); 
     frame.resize(300, 300); 
     frame.setLineWidth(3); 
     frame.setFrameStyle(QFrame::Box); 
     resize(500, 200); 
     show(); 
    } 
}; 

struct Window1 : Window { 
    Window1() : Window("W1") { 
     layout.addWidget(&view, 1); 
     layout.addWidget(&frame, 2); 
    } 
}; 

struct Window2 : Window { 
    QSplitter splitter; 
    Window2() : Window("W2") { 
     layout.addWidget(&splitter); 
     splitter.addWidget(&view); 
     splitter.addWidget(&frame); 
     splitter.setStretchFactor(0, 1); 
     splitter.setStretchFactor(1, 2); 
    } 
    ~Window2() { frame.setParent(0); view.setParent(0); } 
}; 

struct Window3 : Window { 
    QSplitter splitter; 
    QWidget leftWidget; 
    QVBoxLayout leftLayout{&leftWidget}; 
    Window3() : Window("W3") { 
     layout.addWidget(&splitter); 
     splitter.addWidget(&leftWidget); 
     splitter.addWidget(&frame); 
     splitter.setStretchFactor(0, 1); 
     splitter.setStretchFactor(1, 2); 
     leftLayout.setMargin(0); 
     leftLayout.addWidget(&view); 
    } 
    ~Window3() { frame.setParent(0); view.setParent(0); } 
}; 

int main(int argc, char ** argv) { 
    QApplication app{argc, argv}; 
    Window1 w1; 
    Window2 w2; 
    Window3 w3; 
    w2.move(w1.pos() + QPoint(0, 75)); 
    w3.move(w2.pos() + QPoint(0, 75)); 
    return app.exec(); 
} 
+0

非常感謝您抽出這麼詳細的看一下我的問題。我把你的代碼「翻譯」爲python並且有類似的結果。在我的情況下,所有的窗戶甚至幾乎看起來與預期的結果相同!我的ui文件和你的代碼之間的區別是''frame.resize''和''view.resize''調用。如果你評論他們,你也會得到不同的結果。你知道這是爲什麼嗎?如果沒有源代碼,只能使用設計器,我該如何使它工作? – Woltan