理解Qt中的表单布局机制

时间:2010-12-29 10:29:08

标签: qt forms qt4 qt-designer

Qt具有灵活且强大的布局机制,可以处理桌面应用程序窗口的视图。

但它非常灵活,几乎无法理解,当出现问题并需要微调时。如此强大,它可以击败任何人,试图压倒Qt对形式应该如何看待的看法。

那么,任何人都可以解释,或提供文章或Qt定位机制的来源吗?

我正在尝试强制QLabelQPushButtonQTableView,在其名称中标有尾随下划线,比QTextBrowser verticalStretch = 1高两倍下面。如何正确处理小部件的高度?

.ui file of my form on google docs. Search '____' in names, preview in QtDesigner

3 个答案:

答案 0 :(得分:115)

布局实际上很容易理解“我认为”:) 布局的简单解释可以在qt书“ C++ Gui programming with QT 2nd edition

中找到。

关于布局及其尺寸政策,您应该注意什么

  • 大多数Qt小部件都有尺寸政策。此大小策略告诉系统窗口小部件应如何拉伸或缩小。它来自QSizePolicy类。大小策略包含垂直和水平组件。
  • 大多数小部件也有大小提示。此大小提示告诉系统一个小部件优先级
  • QSizePolicy有一个伸展因子,允许小部件以不同的速率增长

我只熟悉4种尺寸政策

  • 固定大小策略 - 窗口小部件的大小是固定的,无法拉伸。它仍然是它的大小提示。
  • 最小尺寸政策 - 尺寸提示是窗口小部件可能的最小尺寸,但如果需要,它仍然会变得更大。
  • 首选尺寸政策 - 小部件可以缩小或增大,但大小提示。
  • 扩展大小政策 - 小部件可以缩小或增长大于其大小提示:)

你可能想问,

首选和扩展之间有什么区别?
回答:想象一下有一个带有2个小部件的表单,一个带有首选,另一个带有扩展,然后任何额外的空间将通过扩展策略赋予窗口小部件。具有首选策略的窗口小部件将保持其大小提示。

我建议(警告:我不是专家:))您购买和阅读 C++ Gui programming with QT 2nd edition ”。我目前正在阅读它并且它有很多意义。看一下图像,看看它们是否有意义。

解释尺寸政策​​
Size policy explained

一个简单的例子
这是一个带有2个按钮的简单对话框,其水平和垂直尺寸策略显示为水平和垂直拉伸。

example

以下是最小尺寸的预览。 alt text

这是另一个较大尺寸的预览 alt text

[编辑://添加大小提示示例]

为什么要关注SIZEHINT
你可以看到每个小部件都有一个sizeHint,这是至关重要的,因为QT的布局系统总是尊重sizeHint。如果窗口小部件的默认大小不是您想要的,那么这只是一个问题。解决此问题的唯一方法是扩展(子类)窗口小部件并重新实现其sizeHint()成员函数。一个例子值1000字。要节省空间,请参阅我的博客,其中有一个示例项目。

答案 1 :(得分:2)

根据其docs

将小部件添加到布局中时,布局过程如下:

  1. 所有小部件将首先根据其QWidget :: sizePolicy()和QWidget :: sizeHint()分配一定的空间。

  2. 如果任何一个小部件都设置了拉伸因子,并且其值大于零,那么它们将按照与拉伸因子成比例的方式分配空间(如下所述)。

  3. 如果任何窗口小部件的拉伸因子设置为零,则只有在没有其他窗口小部件需要该空间的情况下,它们才会获得更多空间。其中,首先使用扩展尺寸策略将空间分配给小部件。

  4. 任何分配的空间少于其最小大小的窗口小部件(如果未指定最小大小,则分配最小大小的提示)将分配给它们所需的最小大小。 (小部件不必具有最小尺寸或最小尺寸提示,在这种情况下,拉伸因子是其决定因素。)

  5. 任何分配了超过其最大大小的空间的小部件都会被分配它们所需的最大大小的空间。 (小部件不必具有最大尺寸,在这种情况下,拉伸因子是其决定因素。)

并且sizeHint()是QWidget的建议大小,并且父级小部件的Layout将考虑sizeHint()sizePolicy()以确定孩子的空间小部件可以容纳。

答案 2 :(得分:-1)

您可以使用QT样式表来控制小部件的高度 和其他属性以易于定制的方式。

http://doc.qt.io/archives/qt-4.7/stylesheet.html

至于布局,你需要明智而强烈地使用它们 与间隔器相结合,以使小部件表现 正是你想要他们的方式。

http://doc.qt.io/archives/qt-4.7/designer-layouts.html