2016-06-07 239 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