1

我有一个想要淡出的按钮小部件 ( self.button1)

def button_slot(self):
    fade_effect = QtGui.QGraphicsOpacityEffect()
    self.button1.setGraphicsEffect(fade_effect)
    hideAnimation = QtCore.QPropertyAnimation(fade_effect, "opacity")
    hideAnimation.setDuration(5000)
    hideAnimation.setStartValue(1.0)
    hideAnimation.setEndValue(0.0)
    hideAnimation.start(QtCore.QPropertyAnimation.DeleteWhenStopped)
    self.hideAnimation = hideAnimation

代码在 PyQt 中,但与原始 Qt 相同。

出于某种原因,当我在测试文件中单独尝试代码时,它运行良好。但是,当尝试将它集成到我的代码中时,似乎淡出动画在后台运行,但在 GUI 本身中没有更新:

  • 按钮卡在“点击”状态。
  • 如果我最小化并放大窗口,按钮的不透明度就在它应该在的位置(例如,如果持续时间从 1.0 到 0.0 为 5000 毫秒,则在 2500 毫秒后放大窗口将显示 0.5 不透明度)。
  • 该按钮是可点击的,即使它看起来“卡住”。

为什么会发生这种情况?如何强制 GUI 在每次事件迭代时自行更新?

4

1 回答 1

1

我唯一可能的解释是你在代码的其他地方阻塞了事件循环。正如您的测试用例所示,动画肯定会运行,但它是从事件循环中调用的。如果你的代码阻塞——如果你的代码中有任何地方让你等待事情、睡觉等,那么这就是你的问题。

Qt 和许多其他框架中的 GUI 代码必须以运行到完成的方式编写。每个插槽和事件处理程序都必须尽快执行,然后返回。当您在插槽中添加断点并在代码停止时查看堆栈跟踪时,您会发现QEventLoop::exec()它就在那里。最终,所有 GUI 代码都从事件循环中调用。

尝试分段减少代码,直到问题消失。这样您就可以知道阻塞部分在哪里。不幸的是,Qt 提供了许多名为 的方法waitxxx(),并且往往在不了解它们阻塞事件循环的情况下使用它们。阻塞的事件循环意味着应用程序不响应用户交互,最终操作系统会检测到它并发出旋转的沙滩球 (OS X)、旋转的圆圈 (Vista/Win7) 或者可能是关于应用程序卡住的消息。旋转的沙滩球/圆圈意味着应用程序的主事件循环被阻塞。

于 2012-06-17T12:46:25.393 回答