ChatGPT解决这个技术问题 Extra ChatGPT

了解 Qt 中的表单布局机制

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

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

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

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

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


t
tripleee

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

关于布局及其尺寸政策您应该注意的事项

大多数 Qt 小部件都有大小策略。此尺寸策略告诉系统小部件应如何拉伸或收缩。它来自 QSizePolicy 类。大小策略既有垂直分量也有水平分量。

大多数小部件也有大小提示。此尺寸提示告诉系统小部件首选尺寸

QSizePolicy 有一个拉伸因子,允许小部件以不同的速率增长

固定尺寸政策 - 小部件的尺寸是固定的,不能拉伸。它仍然保持其大小提示。

最小尺寸策略 - 尺寸提示是小部件的最小可能尺寸,但如果需要,它仍然可以变大。

首选大小策略 - 小部件可以缩小或增长大于其大小提示。

扩展尺寸策略 - 小部件可以缩小或增大到大于其尺寸提示 :)

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

https://i.stack.imgur.com/Y8IDK.png

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

https://i.stack.imgur.com/zVFRD.png

https://i.stack.imgur.com/5XQ5C.png

https://i.stack.imgur.com/2XOBK.png

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

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


非常感谢。您的解释是我对 Qt 布局的假设(并在您推荐的书中阅读了大约一年前:))。所以,我使用适当的尺寸政策和伸展,但无法达到我想要的。很明显,我的 .ui 文件中某处存在错误。您的回答很清楚,所以我将其标记为已接受。
抱歉,示例是俄文的,我很着急,所以没有删除文本内容:(我应该更有意图。无论如何,我只是转发表单以使界面更干净和简单,并尝试强迫客户接受我的变种。这个很糟糕,他们知道。
@曹博尧 是啊,我现在也很好奇。
你能把你提到的博客的链接贴出来吗?
好消息:我找到了 Dr. Deo's blog(我搜索并找到了 Deo 博士链接他的博客的 this comment)坏消息:它关闭了
C
Community

根据其docs

当您将小部件添加到布局时,布局过程如下:所有小部件最初将根据它们的 QWidget::sizePolicy() 和 QWidget::sizeHint() 分配一定数量的空间。如果任何小部件设置了拉伸因子,其值大于零,则它们将按其拉伸因子的比例分配空间(如下所述)。如果任何小部件的拉伸因子设置为零,则只有在没有其他小部件想要空间的情况下,它们才会获得更多空间。其中,空间首先分配给具有扩展大小策略的小部件。分配的空间小于其最小尺寸(或最小尺寸提示,如果没有指定最小尺寸)的任何小部件都被分配了它们所需的最小尺寸。 (小部件不必有最小尺寸或最小尺寸提示,在这种情况下,拉伸因子是它们的决定因素。)任何分配的空间大于其最大尺寸的小部件都会分配它们所需的最大尺寸空间。 (小部件不必有最大尺寸,在这种情况下,拉伸因子是它们的决定因素。)

sizeHint() 是 QWidget 的推荐大小,widget 父级的 Layout 将考虑 sizeHint()sizePolicy() 来确定子 widget 可以容纳的空间。


C
Christophe Weis

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

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

至于布局,您需要明智地使用它们并与垫片紧密结合,以使小部件的行为完全符合您的要求。

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


我知道如何使用布局并且不喜欢使用 qss。但是你能解释一下,为什么我问的小部件尺寸不正确。如果我可以使用 qss 完成这项工作,我会告诉我,我在哪里搞砸了。
我需要详细解释小部件的大小和位置,最好是源代码。因为我问的那些有适当的 sizePolicy、verticalStretch,这还不够。
混合 ui 文件、样式表和代码内设置,你可能会弄得一团糟。如果某些东西的行为不像您预期的那样,您将需要查看所有三个地方。这可能是他们开发 QML 的原因之一