2014-01-22 3 views
0

У меня есть следующий фрагмент коды:Python QT испускает СИГНАЛ не вызывая функцию обратного вызова

def callback(param): 
    print "in callback" 

class Test(QThread): 
    def __init__(self): 
     QThread.__init__(self) 
     #QObject.connect(self, SIGNAL("test_signal(PyQt_PyObject)"), callback) 
     print "Test constructed" 

    def fallback(self, dummy=None): 
     print "in fallback" 

    def run(self): 
     while 1: 
      print "Test running" 
      self.emit(SIGNAL("test_signal(PyQt_PyObject)"), {'a': 'b'}) 
      time.sleep(1) 

t = None 

if __name__ == "__main__": 

    t = Test() 
    t.start() 
    QObject.connect(t, SIGNAL("test_signal(PyQt_PyObject)"), callback) 
    while True: 
     time.sleep(2) 

Однако, обратный вызов (пары) никогда не вызываются, как, я не вижу «в обратном вызове» напечатан на консоли. Может кто-нибудь помочь с этим? Я пробовал разные варианты кода (например, удаление параметра из test_signal, подключение к self.fallback(), не считая каких-либо параметров в self.emit (т. Е. Удаление {'a': 'b'})). Мне нужно пропустить очень простой, но принципиальный механизм, но я просто не могу понять это.

Заранее благодарен!

+0

Обычно я использую C++ qt, но это не выглядит как правильное определение и эмиссия сигнала с pyqt. Проверьте это http://www.pythoncentral.io/pysidepyqt-tutorial-creating-your-own-signals-and-slots/ –

ответ

2

Если вы хотите нить использовать сигналы, необходимые для запуска цикла событий, тем более простой способ, чтобы начать QApplication:

from PyQt4.QtGui import QApplication 
from PyQt4.QtCore import * 
import time 

@pyqtSlot(dict) 
def callback(param): 
    print "in callback" 
    print param 

class Test(QThread): 

    mySignal = pyqtSignal(dict,name="mySignal") 

    def __init__(self): 
     QThread.__init__(self) 

    def run(self): 
     while 1: 
      print "Test running" 
      self.mySignal.emit({'a': 'b'}) 
      time.sleep(1) 

if __name__ == "__main__": 
    t = Test() 
    t.start() 
    t.mySignal.connect(callback) 
    app = QApplication([]) 
    app.exec_() 
+0

Для тех, кто может задаваться вопросом о разных стилях сигналов, вы можете найти дополнительную информацию о новых сигналах стиля [здесь] (http://pyqt.sourceforge.net/Docs/PyQt4/new_style_signals_slots.html), а также информацию о старом стиле сигналы [здесь] (http://pyqt.sourceforge.net/Docs/PyQt4/old_style_signals_slots.html). Я также нашел сравнение старого и нового на старой странице. –

+0

Можете ли вы привести пример правильного использования Eventloop, @xndrme, предположительно 'QEventloop'? Мне сложно найти что-то полезное в SO или Google. Заранее спасибо –

+1

Humm, ну, с циклом событий, я не имел в виду 'QEventloop', проблема в том, что для использования' QThread' вам нужно запустить 'QApplication', как указано [здесь] (http: // qt-project .org/doc/qt-4.8/qt4-threads.html), идея состоит в том, что если вам нужны слоты в '' Qthread', вам нужно запустить цикл событий для потока (что легко, просто назовите 'self. exec _() '), но, может быть, я не понял в своем ответе извинения :(Просто имейте в виду' QThread 's только если' QApplication'. (Если вы найдете способ делать то, что хотите, без 'QApplication' просто позвони мне! ;)) –

2

Вам нужно будет объявить свой собственный сигнал. Это пример PySide, который очень похож на pyqt, но вам, возможно, придется его модифицировать. Это также зависит от версии. Это Python версии 3.3 с PySide 1.2.1

class Test(QThread): 
    test_signal = QtCore.Signal(object) 

... 
    while 1: 
     print "Test running" 
     self.test_signal.emit({"a": "b"}) 

... 
t.test_signal.connect(callback) 
+0

Спасибо за отзыв. Это более полезно для приложения PySide, но также имеет некоторое приложение для PyQt. –

 Смежные вопросы

  • Нет связанных вопросов^_^