2011-03-14 21 views
0

我試圖在PyQt中編寫一個圖形用戶界面,它有一個網絡層,它應該通知GUI通過網絡接收的任何新消息。在C#中,我會在我的網類的書面委託/事件對:PyQt事件從無知模型傳播到查看

//event handler for propagating new message to GUI 
public delegate void MessageReceived(String from, String msg); 
public event MessageReceived messageReceived; 

這樣一來,所有的GUI需要的是對messageReceived變量的引用(和網絡類仍不可知)。

現在,我已經閱讀了關於PyQt中信號和插槽的所有信息,但是我一直無法找到解釋如何複製上述功能的任何內容。有任何想法嗎?

回答

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()的響應。


正如一個側面說明,中NetworkThing()run()功能通過PyQt4中自動運行,因此很少有時間你手動調用它。請撥打self.networkThing.start()

如果你想看看這個東西的一個很好的例子,請閱讀這篇文章:http://diotavelli.net/PyQtWiki/Threading,_Signals_and_Slots

+0

真棒,謝謝!我錯過了異步的c#功能,但也許我可以贏得... – dougvk 2011-03-14 21:22:16

+0

NP。從未用C#編碼,我不能說太多;) – Blender 2011-03-14 21:28:27