我最近从wxPython切换到PyQT,找不到相应的CallAfter。我需要使用pubsub由于一些导入和wx我只是用CallAfter发送消息 - 有没有办法在PyQT中做类似的事情?基本上,我想用pyQT在mainloop中注入一些东西。
编辑更多信息:
在我的旧GUI中,使用wxPython,我使用的是python-openzwave,它使用旧的调度程序模块。我会捕获旧的调度程序信号并将它们转换为pubsub消息(为了便于使用)并使用CallAfter发送新消息,如下所示:
wx.CallAfter(pub.sendMessage, messagePack.signal, message = messagePack.message)
然后我能够通过捕获消息并直接处理gui元素来更新GUI,因为它实际上是在mainloop中注入了一些内容。
现在,使用pyqt,没有callafter所以,我有没有callafter的相同系统设置,但是在收到消息后必须发生的操作不会发生,因为它位于mainloop的中间。 / p>
答案 0 :(得分:2)
我能想到的最接近的事情是使用QTimer.singleShot
进行短暂超时,这将迫使它进入下一个事件循环。
def other_function(self):
print 'other'
def my_function(self):
print 'one'
QTimer.singleShot(1, self.other_function)
print 'two'
Qt有一个事件循环的概念,它会检查是否有需要处理的事件,比如按钮点击,或者需要重新绘制小部件的一部分等等。通常,函数会被调用作为结果一个事件。 QTimer.singleShot
将在事件循环的下一个循环中在要处理的事物列表的末尾粘贴函数调用。
但我同意一些评论,你可能只是使用在另一个线程中运行的单独QObject来处理openzwave事件并将消息重新分派为Qt Signals,主线程可以监听并更新GUI