【问题标题】:Passing check state with QtPushButton.clicked signal使用 QtPushButton.clicked 信号传递检查状态
【发布时间】:2022-06-29 21:00:21
【问题描述】:

我正在处理一个项目,并尝试通过button.clicked.connect(self.button_checked) 将可检查按钮的选中状态传递给函数并遇到问题。如果我在可调用之前使用“装饰”@QtCore.pyqtSlot(),那么检查状态将不会通过。但是,如果我移除装饰,该功能将按预期工作并写入文档。两种情况见下面的代码:

有装饰

...
btn = QPushButton("Push")
btn.setCheckable(True)
btn.toggled.connect(self.button_checked)
...
@QtCore.pyqtSlot()
def button_checked(self, checked):
    print("checked", checked)
...

按下按钮时出现错误TypeError: button_checked() missing 1 required positional argument: 'checked'。但是当我删除 QtCore.pyqtSlot() 并且只有:

...
btn = QPushButton("Push")
btn.setCheckable(True)
btn.toggled.connect(self.button_checked)
...
def button_checked(self, checked):
    print("checked", checked)
...

该按钮按预期工作,并根据选中状态打印checked Truechecked False

我的问题是@QtCore.pyqtSlot() 是干什么用的?我还是 QtPy 的新手,对这条线的目的没有很好的把握。在这种情况下我需要明确分配一个插槽吗?我发现在某些特定情况下(function of pyqtSlot)可能有必要这样做,并且被认为是一种很好的做法,但在这种情况下它似乎产生了我不想要的效果。感谢您传递的任何建议/知识。谢谢。

【问题讨论】:

    标签: python qtpy


    【解决方案1】:

    我收到错误 TypeError: button_checked() missing 1 required positional argument: 'checked'

    那是因为您的插槽不接受任何参数。 将@QtCore.pyqtSlot() 更改为@QtCore.pyqtSlot(bool)

    我的问题是@QtCore.pyqtSlot() 是干什么用的?

    c++ Qt 需要 QMetaObjectSystem 使用它来执行运行时动态操作,例如调用具有正确签名 read more here 的插槽,在 python 情况下,由于 python 的动态特性,不需要它。
    不过,如果您想将插槽从 python (即 Qml)暴露出来,它是必需的,据说是 slightly faster

    【讨论】:

      猜你喜欢
      • 2011-11-11
      • 1970-01-01
      • 2014-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-25
      • 1970-01-01
      相关资源
      最近更新 更多