繁体   English   中英

Qt大小政策和延伸因素

[英]Qt size policy and stretch factors

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

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

不同的布局

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

  1. (W1)上图中左侧的窗口将中央窗口小部件设置为水平布局,由于拉伸系数设置为21 ,因此我希望窗口小部件的大小比例为2/3。
  2. (W2)两个小部件通过QSplitter小部件相互“连接”。 中央窗口小部件设置为t水平布局。 小部件的大小结果与W1不同,并且不是2/3的比例。
  3. (W3)右侧窗口也将两个小部件“连接”到QSplitter,如窗口W2。 Howevert,QListView小部件是QVBoxLayout的子代。 因此QSplitter将QFrame和QVBoxLayout作为其子项。

详细说明三个不同窗口的设置如下图所示:

在此输入图像描述

我有以下问题:

  • 为什么两个小部件的比率在W1,W2和W3之间有所不同?
  • W2的比率似乎受拉伸因素的影响,但与预期的结果无关。 但是W3似乎并没有受到伸展因素的影响。 为什么会这样?
  1. 记录分割器与拉伸因子有关的行为与布局的行为不同:您不应期望它们看起来相同。

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

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

该示例的屏幕截图

// 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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM