我正在尝试在PyQt中编写一个具有网络层的GUI,该层应该通知GUI通过网络接收的任何新消息。在C#中,我会在我的网络类中编写一个委托/事件对:
//event handler for propagating new message to GUI
public delegate void MessageReceived(String from, String msg);
public event MessageReceived messageReceived;
这样,所有GUI需求都是对 messageReceived
变量的引用(并且网络类仍然是不可知的)。
现在,我已经阅读了PyQt中关于信号和插槽的所有内容,但我找不到任何解释如何复制上述功能的内容。有什么想法吗?
答案 0 :(得分:1)
我最近才学会欣赏SIGNAL()
的精彩,并不是太复杂。
您想要创建一个有线程的新类:
class NetworkThing(QtCore.QThread):
def __init__(self, parent = None):
super(NetworkThing, self).__init__(parent)
def run(self):
while True:
time.wait(1.0)
# Do your background stuff, and then emit:
self.emit(QtCore.SIGNAL('messageRecieved(QString)'), 'The response text.')
在主应用程序初始化函数中,您需要准备一个新变量和一个新的SIGNAL()
捕手:
self.networkThing = NetworkThing()
self.connect(self.networkThing, QtCore.SIGNAL('messageRecieved(QString)'), self.processEvent)
现在,网络线程的响应立即传递给函数processEvent()
。
正如旁注所示,run()
的{{1}}函数由PyQt4自动运行,因此很少有人手动调用它。相反,请致电NetworkThing()
。
如果你想看一个非常好的例子,请阅读这篇文章:http://diotavelli.net/PyQtWiki/Threading,_Signals_and_Slots。