我制作了一个带有
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 方法将其作为参数的运行时错误。为什么检查的参数没有随信号一起发送?
似乎 PySide 中对具有默认参数(例如
triggered
和 clicked
)的信号的处理与 PyQt 中的不同。前者不允许接收槽中存在任何位置参数,但后者会很乐意地丢弃未使用的参数而不抱怨。
在 PySide 和 PyQt 中,具有默认参数的信号实际上有两个重载:一个“无操作”版本,不发送任何内容(或者,在 PyQt 中,始终发送
False
),以及一个“活动”版本,发送当前检查状态。
“无操作”版本是默认版本,因此要获取“活动”版本,您必须显式选择它,如下所示:
action.triggered[bool].connect(slot)
至于槽签名:在 PySide 中,最稳健的解决方案可能是这样的:
def slot(self, checked=False):
我可以确认这种行为。我也看到检查的参数没有通过。
文档有一个默认的(
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