【问题标题】:Pass arguments to a slot using QTimer使用 QTimer 将参数传递给插槽
【发布时间】:2012-01-08 02:20:06
【问题描述】:

我编写了一个 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

为什么会发生这种情况,我能做些什么来解决它?
提前致谢。



编辑:
备注一:
dummyFunc 以前工作过,但它不适用于lambda:self.dummyFunc()

备注 2:
我期待lambda:self.shouldGiveError() 出现错误,因为没有这样的功能,但我什么也没得到。

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

【问题讨论】:

  • 在我看来,您的示例不起作用,因为第一次调用 dummyFunc 会断开信号?

标签: python qt python-3.x pyqt pyqt4


【解决方案1】:

你看过QObject.invokeMethod()吗?

它从 PyQt 4.4 开始就受到支持,它应该允许你在没有匹配的信号时调用带有参数的槽。

【讨论】:

  • 它看起来不错,但我不知道如何将它与QTimer的超时信号一起使用。我正在尝试查看示例
  • 嗯......好吧,QObject.connect() 的工作方式是找到具有最大参数数量(或更少)的插槽以匹配插槽。因此,您不能真正将其连接到具有更多参数的插槽。你需要以某种方式整理论点。因此,在您的示例中,您将需要存储您的 peerSocket,然后将其传递到您的“无参数”超时槽中。抱歉,我回答了“错误”的问题。”
猜你喜欢
  • 2011-07-06
  • 2020-03-12
  • 2022-01-10
  • 2011-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-11
  • 1970-01-01
相关资源
最近更新 更多