【问题标题】:Optional Signal Arguments可选信号参数
【发布时间】:2018-11-01 20:01:25
【问题描述】:

我有一个具有默认关键字参数的函数。我在实现这一点时遇到了麻烦,因为我不断收到一个错误,如果我的信号有两个参数,那么我需要传递两个参数。有没有办法解决这个问题?

class Controller(QWidget):
    trigger = pyqtSignal(str, str)
    def __init__(self):
        self.trigger.connect(self.myfunc)

    @pyqtSlot(str, str)
    def function(argument, optional_argument=''):
         do something

c = Controller()
c.trigger.emit('Hello', 'World') # This works
c.trigger.emit('Hello')  # This fails and says I need 2 arguments

【问题讨论】:

  • 遗憾的是,我不相信这是可能的,尽管 C++ 中的 Qt 本身就支持这一点。
  • @AlexanderHuszagh 是的,在 python 中是可能的,在 C++ 中,MOC 完成了创建具有 2 个签名的 2 个信号的肮脏工作,但在 python 中,必须清楚地指出两个签名。 :-)

标签: python pyqt pyqt5 qt-signals qt-slot


【解决方案1】:

除了重载信号支持的类型之外,还必须使连接指向签名:

import sys
from PyQt5 import QtCore


class Controller(QtCore.QObject):
    trigger = QtCore.pyqtSignal([str], [str, str])

    def __init__(self):
        super(Controller, self).__init__()
        self.trigger[str].connect(self.function)
        self.trigger[str, str].connect(self.function)

    @QtCore.pyqtSlot(str)
    @QtCore.pyqtSlot(str, str)
    def function(self, argument,  optional_argument=''):
        print(argument, optional_argument)


def main():
    app = QtCore.QCoreApplication(sys.argv)
    c = Controller()
    c.trigger[str].emit('Hello')
    c.trigger[str, str].emit('Hello', 'World')
    QtCore.QTimer.singleShot(100, QtCore.QCoreApplication.quit)
    sys.exit(app.exec_())


if __name__ == "__main__":
     main()

【讨论】:

  • 如果不是def function(self, argument, optional_argument=''),而是def function(self, *args),那么pyqtSlot(...) 装饰器会是什么样子(如果可能的话)?
  • @SamG101 最大的问题:你试过了吗?
  • 将 pyqtSlot() 与 pyqtSlot(str) 之类的一个参数一起使用会切断我想使用的其他参数,但是如果我只使用 20 个参数例如,所以我想知道是否应该采取不同的方法。我现在正在考虑将 pyqtSlot 包装在一个新定义的装饰器中,看看我是否可以通过这种方式改变行为。 (顺便说一句,我从 QML 调用插槽而不是 pyqtSignal)。
  • @SamG101 为什么需要使用多种类型?为什么不使用listdict 之类的容器?我不会继续讨论,因为您没有提供太多详细信息,因此如果您需要更多帮助,请创建一个帖子,在其中提供更多详细信息并提供 MRE。
猜你喜欢
  • 1970-01-01
  • 2021-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多