QAction 触发信号未传递检查参数

问题描述 投票:0回答:2

我制作了一个带有

QAction
的菜单栏,设置为可检查

self.display_features_action = QtGui.QAction("Show Features", parent)
self.display_features_action.setCheckable(True)
self.display_features_action.setChecked(True)

然后我连接到这个

class MyClass:
    def __init__(....)
         ....
         self.display_features_action.triggered.connect(self.my_slot)

    def my_slot(self, checked)
         ....

但是当只提供一个时,我收到 my_slot 方法将其作为参数的运行时错误。为什么检查的参数没有随信号一起发送?

python parameters pyqt pyside signals-slots
2个回答
3
投票

似乎 PySide 中对具有默认参数(例如

triggered
clicked
)的信号的处理与 PyQt 中的不同。前者不允许接收槽中存在任何位置参数,但后者会很乐意地丢弃未使用的参数而不抱怨。

在 PySide 和 PyQt 中,具有默认参数的信号实际上有两个重载:一个“无操作”版本,不发送任何内容(或者,在 PyQt 中,始终发送

False
),以及一个“活动”版本,发送当前检查状态。

“无操作”版本是默认版本,因此要获取“活动”版本,您必须显式选择它,如下所示:

    action.triggered[bool].connect(slot)

至于槽签名:在 PySide 中,最稳健的解决方案可能是这样的:

    def slot(self, checked=False):

0
投票

我可以确认这种行为。我也看到检查的参数没有通过。

QAction.triggered

文档
有一个默认的(
checked=False
)参数。也许这意味着有时信号在没有额外参数的情况下被调用,然后检查应该为假。

另一方面,我做了一个小例子,发现从来没有额外的参数,尽管检查偶尔应该为True(如果检查过)并且文档也说它应该。

所以我想最好的方法是删除那个已检查的参数,如果你需要它,请致电

isChecked
:

def my_slot(self, checked=False) # just in case there is an argument
   # just to be sure you really find out if it is checked, store the action and ask
   checked = self.action.isChecked() 

我的示例显示了该特定行为(Python 3.4 上的 PySide 1.2.2):

from PySide import QtGui

def test(checked=False):
    print(checked, a.isChecked())

app = QtGui.QApplication([])

t = QtGui.QToolBar()
a = QtGui.QAction('Action', t)
a.setCheckable(True)
a.setChecked(True)
a.triggered.connect(test)
t.addAction(a)
t.show()

app.exec_()

交付

False False
False True
© www.soinside.com 2019 - 2024. All rights reserved.