Qt:When is layout";最后一句;?

Qt:When is layout";最后一句;?,qt,Qt,我遇到了一个问题,我无法确定布局何时发生 简化示例: 我有一个小部件和两个子部件 顶部小部件具有扩展宽度和固定高度。假设固定高度默认为50 底部小部件具有扩展的高度和宽度 有一个垂直布局设置 假设在某个地方有一个按钮,我可以单击它来运行代码。按钮不在小部件上,使事情变得简单 单击按钮时,我会执行以下操作: 我测量底部可扩展小部件的高度。高度是100 然后是“topWidget->SetMaximumHeight(100)”和“topWidget->SetMinimumHeight(100)”

我遇到了一个问题,我无法确定布局何时发生

简化示例:

我有一个小部件和两个子部件

  • 顶部小部件具有扩展宽度和固定高度。假设固定高度默认为50
  • 底部小部件具有扩展的高度和宽度
  • 有一个垂直布局设置
假设在某个地方有一个按钮,我可以单击它来运行代码。按钮不在小部件上,使事情变得简单

单击按钮时,我会执行以下操作:

  • 我测量底部可扩展小部件的高度。高度是100
  • 然后是“topWidget->SetMaximumHeight(100)”和“topWidget->SetMinimumHeight(100)”
  • 我再次测量底部可扩展小部件的高度。高度仍为100
  • 但是我看到底部的可扩展小部件改变了高度

    这意味着当我执行步骤3时,布局还没有发生。无论我做什么,update(),updateGeometry()-我都无法让底部小部件在步骤2和步骤3之间更改高度

    我解决这一问题的唯一方法是让计时器等待,比如250ms,然后测量底部小部件的高度--然后它总是正确的-这意味着重新布局正确进行

    这是一个疯狂/肮脏的解决方案,但我没有其他解决方案。是否有一个API我丢失了,可以让我立即确定、同步地更改布局并查询受影响小部件的新大小?

    来自用户:alexisdm


    尝试在步骤2和步骤3之间调用QApplication::processEvents()(它应该执行计时器允许事件循环执行的操作)

    尝试在步骤2和步骤3之间调用
    QApplication::processEvents()
    它应该执行计时器允许事件循环执行的操作)。尝试调用
    activate()
    在您的布局上。那么,在您重新检查底部小部件的大小之前,顶部小部件不会调整大小?也许您可以尝试检查顶部小部件发出的
    调整大小事件
    ,并在收到信号后执行步骤3。根据文档,“调用resizeEvent()时,小部件已经有了新的几何体。”我使用的是QT 4.8.5,不,我可以发誓,在对几何体进行实际更改之前,有时会调用顶部小部件上调用的resizeEvent。在内部底部小部件上的“resizeEvent”代码中查询“geometry()”,将给出旧的高度,并且确保较低的小部件稍后更改其高度。我通过精确的日志记录捕捉到了这种行为。QApplication::processEvents()完成了这项工作。如果你把你的小费作为回答,我会相信你的。