Передайте аргументы в слот, используя QTimer - PullRequest
3 голосов
/ 28 ноября 2011

Я написал клиент-серверное приложение pyQt. (python: 3.2.2, pyQT: 4.8.6)
Отправитель отправляет сообщение прослушивающим получателям, а получатели отправляют ответ отправителю. Я не хочу, чтобы ответ был отправлен мгновенно, но после небольшой задержки.

Это часть кода получателя:

----------------------------- msghandler.py-----------------------------------
class MsgHandler(QObject):
    def __init__(self):
        QObject.__init__(self)
        self.mSec1Timer = None

    def setParentUI(self, p):
        self.parentUI = p

    def handle_ask(self, ID, stamp, length, cargo, peerSocket):
        print("Incoming:ASK")
        #self.mSec1Timer.timeout.connect(lambda:self.send_msg_reply(peerSocket))
        self.mSec1Timer.timeout.connect(self.dummyFunc) #Works
        self.mSec1Timer.timeout.connect(lambda:self.dummyFunc())#See Rem-1
        self.mSec1Timer.timeout.connect(lambda:self.shouldGiveError())#See Rem-2
        self.parentUI.timerStart.emit(5)

    @pyqtSlot(tuple)
    def send_msg_reply(self, peerSocket):
        print("This is not printed")
        self.mSec1Timer.timeout.disconnect()

    @pyqtSlot()
    def dummyFunc(self):
        print("dummy @ ",QDateTime.currentMSecsSinceEpoch())
        self.mSec1Timer.timeout.disconnect()
------------------------------------------------------------------------------

from msghandler import *
class DialogUIAgent(QDialog):

    timerStart = pyqtSignal(int)

    def __init__(self):
        QDialog.__init__(self)

        self.myHandler = MsgHandler()
        self.myHandler.setParentUI(self)

        self.myTimer = QTimer()
        self.myTimer.setSingleShot(True)
        self.myHandler.mSec1Timer = self.myTimer

        self.timerStart.connect(self.startMyTimer)

    @pyqtSlot(int)
    def startMyTimer(self, msec):
        self.myTimer.start(msec)

Для тестирования поведения сначала я использовал self.mSec1Timer.timeout.connect(self.dummyFunc), и результат был таким, как ожидалось:

Incoming:ASK
dummy @  1322491256315
Incoming:ASK
dummy @  1322491260310
Incoming:ASK
dummy @  1322491265319
Incoming:ASK
dummy @  1322491270323
Incoming:ASK
dummy @  1322491275331

Но когда я использовал self.mSec1Timer.timeout.connect(lambda:self.send_msg_reply(peerSocket)), слот никогда не вызывался. Выход:

Incoming:ASK
Incoming:ASK
Incoming:ASK
Incoming:ASK

Почему это происходит, и что я могу сделать, чтобы это исправить?
Заранее спасибо.



РЕДАКТИРОВАТЬ:
Примечание-1:
До этого работал dummyFunc, но он не работает с lambda:self.dummyFunc()

Примечание-2:
Я ожидал ошибку с lambda:self.shouldGiveError(), потому что нет такой функции, но вместо этого я ничего не получаю.

Это проблема того, как я использую лямбду?

1 Ответ

0 голосов
/ 29 ноября 2011

Вы смотрели на QObject.invokeMethod () ?

Он поддерживается с PyQt 4.4 и должен позволять вам вызывать слот с аргументами, когда у вас нет соответствующего сигнала.

...