使用QTimer将参数传递给槽函数

3 投票
1 回答
2201 浏览
提问于 2025-04-17 07:14

我写了一个用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() 会报错,因为没有这个函数,但结果却什么都没有。

这是我使用lambda的方式有问题吗?

1 个回答

0

你有没有看过 QObject.invokeMethod() 这个方法?

这个方法从 PyQt 4.4 开始就支持了,它可以让你在没有合适的信号时,仍然能够带着参数调用一个槽函数。

撰写回答