在插入之前查找 QWidget 的高度

Posted

技术标签:

【中文标题】在插入之前查找 QWidget 的高度【英文标题】:Finding a QWidget's height before inserting 【发布时间】:2011-11-19 00:07:39 【问题描述】:

我有一个要插入的小部件,看起来像这样

+--------------------+
| +-------++-------+ |
| |       ||       | |
| |       ||       | |
| |       || Label | |
| | Label || Label | |
| |       ||       | |
| |       ||       | |
| +-------++-------+ |
+--------------------+

一个包含两个 QVBoxLayouts 的 QWidget 元素,每个包含一个或多个 QLabels。这个 Widget 将被插入到具有拉伸单元格的垂直布局中,因此所有此类小部件都将位于顶部并且缩小到尽可能小的高度。

导致这样的事情。

______________________ ← Layout boundary
+--------------------+
| +-------++-------+ |
| |       || Label | |
| | Label || Label | | ← Widget shrunk to the smallest
| +-------++-------+ |
+--------------------+
______________________ ← Layout boundary
          ↑
          |
          | ← Spacer
          |
          ↓
______________________ ← Layout boundary

但在进行此插入之前,我想知道小部件在插入布局中的大小。也许是其内部布局允许的最小尺寸。不知道怎么称呼。

我已经尝试了很多方法,例如将小部件插入到备用不可见布局中,这样我可以在插入时检索它的高度,这应该与小部件在我的最终布局中插入时所采用的高度相同。

但由于某种原因,当垂直按下小部件时,我总是得到 480 或 478。所以我完全迷路了。

我必须这样做,因为我需要小部件在插入时进行动画处理,并且我需要知道从高度 1 到它的动画所需的高度。

我该怎么做?

【问题讨论】:

不是非常相关,但很棒的图表;) 您是否尝试过 QLayout::minimumSize() 用于小部件内部布局? 【参考方案1】:

如果没有确切的代码,很难确定,但刚刚尝试重现您的示例,根据上面的描述,我建议查看以下内容:

    听起来您实际上是在显示小部件之前调用widget->height()。相反,请尝试调用widget->sizeHint().height()。 QWidget::sizeHint() 方法告诉您小部件希望是什么尺寸,如果父几何没有对其施加任何其他约束。

    如果您获得sizeHint() 后仍然得到错误答案,请查看QWidget::ensurePolished() 的文档。我认为调用它很重要,以便为尚未显示的小部件获得更准确的几何形状:

    QWidget 在它完全构造之后但在它第一次显示之前调用这个函数。如果要确保在执行操作之前对小部件进行抛光处理,可以调用此函数,例如,在小部件的 sizeHint() 重新实现中可能需要正确的字体大小。

    如果您仍然遇到问题,请查看QWidget::sizePolicy() 和QSizePolicy Class Reference 类的文档。我必须承认,无论我多少次阅读enum QSizePolicy::Policy 上的文档,它们都不会全部沉入其中。一个不正确的尺寸策略值很容易弄乱你的布局。

    在实际应用大小策略之前,值得在 Qt Designer 中尝试不同的大小策略。

【讨论】:

+1 - 480 的高度几乎可以肯定是因为它从未显示过。 sizeHint().height() 或 layout->minimumSize().height() 都应该在显示之前返回正确的值 我在发布后大约一小时解决了这个问题,但是以一种非常丑陋的方式......显示(),获取高度,然后隐藏()。你的方法效果更好,我已经尝试过并且有效。一开始我使用->geometry.height(); 访问,这似乎与您猜我使用的相同。问候。

以上是关于在插入之前查找 QWidget 的高度的主要内容,如果未能解决你的问题,请参考以下文章

QWidget::repaint:更新进度条时检测到递归重绘

setCentralWidget就可以把Qwidget设置为QMainWindow的主窗口

从插槽 PyQt 更改背景颜色

确定在按下按钮之前最后一个焦点的 QWidget

平衡二叉树插入操作的详细过程图解

AVL树的插入和删除