Qt大小政策和延伸因素

时间:2016-06-07 13:22:15

标签: qt qt-designer

选项大小策略和延伸因素如何影响窗口小部件的大小?

下图显示了三个不同排列窗口的预览。对于所有三个窗口(W1-W3),右侧的小部件是QFrame小部件,其水平和垂直大小策略设置为 Preferred (这是默认设置)。水平伸展因子设置为 2 。左侧的小部件是一个QListView小部件,其大小策略也设置为首选(默认情况下,这将是扩展),水平延伸因子设置为 1 。 / p>

Different layouts

三个窗口的不同之处在于两个小部件相互布局的方式。

  1. (W1)上图中左侧的窗口将中央窗口小部件设置为水平布局,因为拉伸因子设置为,因此我希望窗口小部件的大小比例为2/3 2 1
  2. (W2)这两个小部件是"已连接"通过QSplitter小部件互相通过。中央窗口小部件设置为t水平布局。小部件大小的结果与W1不同,并且不是2/3的比率。
  3. (W3)正确的窗口"连接"两个小部件也在窗口W2中​​有一个QSplitter。 Howevert,QListView小部件是QVBoxLayout的子代。因此,QSplitter将QFrame和QVBoxLayout作为其子项。
  4. 详细说明三个不同窗口的设置如下图所示:

    enter image description here

    我有以下问题:

    • 为什么两个小部件的比率在W1,W2和W3之间有所不同?
    • W2的比率似乎受到拉伸因素的影响,但与预期结果无关。但是W3似乎并没有受到伸展因素的影响。为什么会这样?

1 个答案:

答案 0 :(得分:2)

  1. 记录分割器与拉伸因子有关的行为与布局的行为不同:您不应期望它们看起来相同。

  2. W2&如果按照您的要求实施,W3应该看起来相同。你的ui文件中有错误。

  3. 这是一个不使用.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();
    }