Распространение событий PyQt из невежественной модели для просмотра - PullRequest
0 голосов
/ 14 марта 2011

Я пытаюсь написать GUI в PyQt, который имеет сетевой уровень, который должен уведомлять GUI о любых новых сообщениях, полученных по сети.В C # я написал бы пару делегат / событие в моем сетевом классе:

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

Таким образом, все, что нужно GUI, - это ссылка на переменную messageReceived (икласс net остается независимым).

Теперь я прочитал все о сигналах и слотах в PyQt, но я не смог найти ничего, что объясняло бы, как повторить вышеупомянутую функциональность.Есть идеи?

1 Ответ

1 голос
/ 14 марта 2011

Я только недавно научился ценить удивительность 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() catcher:

self.networkThing = NetworkThing()
self.connect(self.networkThing, QtCore.SIGNAL('messageRecieved(QString)'), self.processEvent)

Теперь, ответ сетевого потока, который он немедленно передал функции processEvent().


Как примечание, PyQt4 автоматически запускает функцию run() для NetworkThing(), поэтому вы редко вызываете ее вручную.Вместо этого звоните self.networkThing.start().

Если вы хотите посмотреть на довольно хороший пример этого материала, прочитайте эту статью: http://diotavelli.net/PyQtWiki/Threading,_Signals_and_Slots.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...