选项大小策略和拉伸(stretch)因子如何影响小部件的大小?

下图显示了三个不同排列的窗口的预览。对于所有三个窗口(W1-W3),右侧的小部件都是QFrame小部件,其水平和垂直大小策略设置为Preferred(默认设置)。水平拉伸(stretch)因子设置为2。左侧的小部件是QListView小部件,它的大小策略也设置为Preferred(默认情况下为Expanding),水平拉伸(stretch)因子设置为1。

Qt大小政策和拉伸(stretch)因子-LMLPHP

这三个窗口在两个窗口小部件相互布局的方式上有所不同。

  • (W1)上图左侧的窗口中的中央窗口小部件设置为水平布局,由于将拉伸(stretch)因子设置为2和1,因此我期望窗口小部件的尺寸比率为2/3。
  • (W2)这两个小部件通过QSplitter小部件彼此“连接”。中央窗口小部件设置为水平布局。窗口小部件的大小结果与W1不同,并且不是2/3的比率。
  • (W3)右窗口也与窗口W2中​​的QSplitter“连接”两个小部件。但是,QListView小部件是QVBoxLayout的子级。因此,QSplitter将QFrame和QVBoxLayout作为其子级。

  • 下图详细显示了三个不同窗口的设置:

    Qt大小政策和拉伸(stretch)因子-LMLPHP

    我有以下问题:
  • 为什么两个小部件的比率在W1,W2和W3之间不同?
  • W2中的比率似乎受拉伸(stretch)因子的影响,但是不受预期结果的影响。但是W3似乎完全不受拉伸(stretch)因子的影响。为什么会这样?
  • 最佳答案

  • 记录的与拉伸(stretch)因子有关的拆分器行为与布局的行为不同:您不应期望它们看起来相同。
  • 如果按照您的要求实现,则W2和W3应该看起来相同。您的ui文件中有一个错误。

  • 这是一个不使用.ui文件的测试用例:

    Qt大小政策和拉伸(stretch)因子-LMLPHP
    // 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();
    }
    

    关于Qt大小政策和拉伸(stretch)因子,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37680657/

    10-13 00:16