Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt Eventloop未更新GUI小部件不透明度值_Qt_Qt4_Pyqt4 - Fatal编程技术网

Qt Eventloop未更新GUI小部件不透明度值

Qt Eventloop未更新GUI小部件不透明度值,qt,qt4,pyqt4,Qt,Qt4,Pyqt4,我有一个按钮小部件,我想淡出(self.button1) 代码是PyQt格式的,但与原始Qt相同 出于某种原因,当我在测试文件中单独尝试代码时,它工作得很好。 但是,当尝试将其集成到我的代码中时,似乎淡出动画在后台运行,但在GUI中未更新: 按钮卡在“单击”状态 如果我最小化并放大窗口,按钮的不透明度就在它应该的位置(例如,如果持续时间从1.0到0.0为5000ms,则在2500ms后放大窗口将显示0.5不透明度) 即使按钮看起来“卡住”,也可以单击 为什么会发生这种情况?如何强制GUI在每

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

代码是PyQt格式的,但与原始Qt相同

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

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

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

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

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


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

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

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


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

这里不是这种情况。eventloop没有被阻止,因为任何其他
QRect
动画都可以正常工作。我可以继续使用主GUI窗口。这些小部件只有在被隐藏时才会被重新采样。我将这种行为记录到一个AVI文件中:设置一个40ms计时器,并将其
timeout()
信号连接到该动画小部件上的
update()
插槽。如果这有帮助的话,它会成为一个Qt错误,或者更可能是一个PyQt错误。这没有帮助。我尝试删除部分代码,并成功地修改了有问题的对象。出于某种原因,如果显示QAxContainer.QAxWidget小部件,则会破坏淡入淡出效果。这种行为很熟悉吗?好吧,这是有意义的。您是将其显示为同一小部件的子部件,而问题按钮是子部件,还是单独的窗口?尝试将容器设置为单独的窗口,看看是否有帮助。正如我之前所说的,我仍然认为这是一个Qt/PyQt错误,除非您不正确地使用ActiveX容器。只有当它在同一个窗口中时,我才会遇到问题。如果它在一个单独的窗口上运行-它工作正常。我可以为一个单独的窗口制作一个容器并将其注入主窗口吗?这里不是这种情况。eventloop没有被阻止,因为任何其他
QRect
动画都可以正常工作。我可以继续使用主GUI窗口。这些小部件只有在被隐藏时才会被重新采样。我将这种行为记录到一个AVI文件中:设置一个40ms计时器,并将其
timeout()
信号连接到该动画小部件上的
update()
插槽。如果这有帮助的话,它会成为一个Qt错误,或者更可能是一个PyQt错误。这没有帮助。我尝试删除部分代码,并成功地修改了有问题的对象。出于某种原因,如果显示QAxContainer.QAxWidget小部件,则会破坏淡入淡出效果。这种行为很熟悉吗?好吧,这是有意义的。您是将其显示为同一小部件的子部件,而问题按钮是子部件,还是单独的窗口?尝试将容器设置为单独的窗口,看看是否有帮助。正如我之前所说的,我仍然认为这是一个Qt/PyQt错误,除非您不正确地使用ActiveX容器。只有当它在同一个窗口中时,我才会遇到问题。如果它在一个单独的窗口上运行-它工作正常。我可以为一个单独的窗口制作一个容器并将其注入主窗口吗?
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