PyQt事件从无知模型传播到视图

时间:2011-03-14 20:42:56

标签: user-interface event-handling pyqt

我正在尝试在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中关于信号和插槽的所有内容,但我找不到任何解释如何复制上述功能的内容。有什么想法吗?

1 个答案:

答案 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