了解Qt中的表单布局机制

83

Qt拥有一个灵活且强大的布局机制来处理桌面应用程序窗口的视图。

但它是如此灵活,以至于当出现问题并需要微调时,几乎无法理解。而且它非常强大,甚至可以击败任何人在试图压倒Qt对表单外观的看法时的尝试。

那么,有没有人能解释一下,或提供关于Qt定位机制的文章或来源?

我正在尝试强制使用名称中带有下划线的QLabelQPushButtonQTableView的高度是下方verticalStretch = 1QTextBrowser的两倍。我该如何适当地处理部件的高度?

这是我表单的.ui文件,可在QtDesigner中搜索名称中的“____”进行预览

3个回答

148

布局实际上很容易理解,我认为。 :)
关于布局的简单解释可以在QT书籍“C++ Gui programming with QT 2nd edition”中找到。

关于布局及其尺寸策略应注意的事项

  • 大多数Qt窗口小部件都有一个尺寸策略。该尺寸策略告诉系统窗口小部件如何伸缩。它源自QSizePolicy类。尺寸策略具有垂直和水平组件。
  • 大多数小部件还有一个尺寸提示。此尺寸提示告诉系统小部件的首选大小。
  • QSizePolicy具有拉伸因子,以允许小部件以不同的速率增长。
**我只熟悉4种尺寸策略**
  • 固定尺寸策略 - 小部件的大小是固定的,无法拉伸。它保持在其尺寸提示大小。
  • 最小尺寸策略 - 尺寸提示是小部件可能的最小尺寸,但是如果需要,它仍然可以增大。
  • 首选尺寸策略 - 小部件可以缩小或扩大超过其尺寸提示。
  • 可扩展的尺寸策略 - 小部件可以缩小或扩大超过其尺寸提示 :)
你可能会问, 首选和可扩展之间有什么区别? **答案:** 想象一下具有首选和可扩展属性的两个小部件的表单。然后任何额外的空间将分配给具有可扩展策略的小部件。具有首选策略的小部件将保持在其尺寸提示大小。

我建议(警告:我不是专家 :))你购买并阅读"C++ Gui programming with QT第二版"。我正在阅读它,感觉很有道理。看看图片,看看它们是否有些意义。

解释大小策略
Size policy explained

一个简单的例子
这是一个简单的对话框,其中有两个按钮,它们的水平和垂直大小策略以及水平和垂直拉伸都显示出来了。

example

这是最小尺寸的预览。 alt text

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

[编辑://添加了sizeHint示例]

为什么你应该关心sizeHint
您可以看到每个小部件都有一个sizeHint,这是至关重要的,因为QT的布局系统始终尊重sizeHint。只有当小部件的默认大小不完全符合您的要求时,才会出现此问题。解决此问题的唯一方法是扩展(子类化)小部件并重新实现其sizeHint()成员函数。一个例子胜过千言万语。为节省空间,请参阅我的博客,其中有一个示例项目。


非常感谢。您的解释正是我对Qt布局的假设(并且是一年前您推荐的书中所读到的 :))。因此,我使用了适当的大小策略和拉伸,但无法实现我想要的效果。很明显,在我的.ui文件中有一个错误。您的回答非常详细清晰,所以我会将其标记为已接受。 - Maxim Popravko
抱歉,示例是俄语的,而且我很匆忙,所以没有删除文本内容:( 我应该更加专注。无论如何,我会重新布局表单,使界面更加干净简洁,并尝试强制客户接受我的变体。这个现有的界面太糟糕了,他们也知道。 - Maxim Popravko
@曹博堯 是的,我现在也很好奇。 - Adri C.S.
请问您能否发布一下您提到的博客链接? - DBedrenko
2
好消息是:我找到了Dr. Deo的博客(我搜索并找到了这条评论,在其中Dr. Deo链接了他的博客)。 坏消息是:它已经关闭了。 - James Mart
亚马逊书籍链接(如果您希望绕过archive.org),C++ GUI Programming with Qt 4(第2版),目前售价19美元,我不知道是否有Qt5的相应版本。 - jrh

3
根据其文档
当您将小部件添加到布局中时,布局过程会按照以下方式工作:
1. 所有小部件最初都将根据它们QWidget::sizePolicy()和QWidget::sizeHint()获得一定的空间。
2. 如果任何小部件已设置了大于零的拉伸因子,则它们将按比例分配空间(下面解释)。
3. 如果任何小部件的拉伸因子设置为零,则它们只会在没有其他小部件需要该空间时获得更多的空间。在这些小部件中,首先为具有扩展大小策略的小部件分配空间。
4. 分配给小部件的空间少于它们的最小大小(如果未指定最小大小提示,则为最小大小提示),则将分配给它们所需的最小大小。(部件不必具有最小大小或最小大小提示,在这种情况下,拉伸因子是其决定因素。)
5. 分配给小部件的空间超过其最大大小,则将分配给它们所需的最大大小空间。(小部件不必具有最大大小,在这种情况下,拉伸因子是其决定因素。)
sizeHint()是QWidget的推荐大小,小部件父级的Layout将考虑sizeHint()sizePolicy()来确定子小部件可以占用的空间。

-4

我知道如何使用布局,并且不喜欢使用qss。但是你能解释一下,为什么我询问的小部件大小不正确吗?如果我可以用qss完成工作,我会这样做,只要告诉我,我在哪里搞砸了。 - Maxim Popravko
我需要详细的解释,最好是源代码,关于小部件如何调整大小和定位。因为我询问的那些小部件具有适当的大小策略、垂直拉伸,但这还不够。 - Maxim Popravko
2
混合UI文件、样式表和代码设置可能会导致混乱。如果某些内容的行为与您期望的不同,您需要查看这三个位置。这可能是他们开发QML的原因之一。 - Knitschi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接