【问题标题】:PyQT5: What's this boolean passed when a menu action is triggered?PyQT5:触发菜单操作时传递的这个布尔值是什么?
【发布时间】:2015-02-05 05:40:30
【问题描述】:

所以我在 Python 方面相对较新,我一直在尝试学习 PyQt。我想根据列表的内容动态创建一个菜单。我找到了一个我改编的例子,它看起来像这样:

  for someText in myList:
        entry = QAction(someText,MainWindow)
        self.myMenu.addAction(entry)
        entry.triggered.connect(lambda menuItem=someText: self.doStuff(menuItem))
        entry.setText(someText)

The menu was created but when a menu item was chosen doStuff() always got passed a value of False.所以我把上面的改成:

  for someText in myList:
        entry = QAction(someText,MainWindow)
        self.myMenu.addAction(entry)
        entry.triggered.connect(lambda bVal, menuItem=someText: self.doStuff(bVal,menuItem))
        entry.setText(someText)

果然,现在一切都按我的意愿工作了。我仍然在 bVal 中得到 False,我只是忽略了它。

我已经尝试查看 PyQt 文档,但参考部分链接到 C++ 文档,我看不出发生了什么。

我想了解布尔值是什么以及为什么在我的情况下它总是 False。我尝试过改变各种事情,但我没有设法找到一个正确的场景。

谢谢

PyQT5.4,Windows 上的 Python 3.4.2。

【问题讨论】:

    标签: python pyqt pyqt5


    【解决方案1】:

    triggered signal 的 C++ 文档应该不难理解:

    void QAction::​triggered(bool checked = false)
    ...
    如果动作是可检查的,如果动作被选中,checked 为真,如果动作未被选中,则为假。

    因此,信号是通过一个布尔参数发出的,该参数指示操作的“已检查”状态,并且此参数覆盖了您的 menuItem 参数的默认值。

    【讨论】:

    • 谢谢,由于某种原因我找不到。
    • 在 PyQt/PySide 中,您必须明确要求检查状态,否则它将始终发送False(即使该操作已设置为可检查)。所以你需要做action.triggered[bool].connect(...)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多