QAction触发信号未通过检查参数

时间:2015-02-04 09:51:11

标签: python qt pyqt pyside qt-signals

我制作了一个菜单栏,其中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方法的参数时,我得到一个运行时错误。为什么检查参数不是随信号一起发送的?

2 个答案:

答案 0 :(得分:3)

似乎使用默认参数(例如triggeredclicked)处理信号在PySide中与PyQt中的信号不同。前者不会在接收槽中允许任何位置参数,但后者会很乐意丢弃未使用的参数而不会抱怨。

在PySide和PyQt中,具有默认参数的信号实际上有两个重载:a" no-op"什么都不发送的版本(或者,在PyQt中,始终发送False),以及"活动" version,发送当前检查状态。

" no-op"版本是默认值,因此要获得"活动"版本,您必须明确选择它,如下所示:

    action.triggered[bool].connect(slot)

至于插槽签名:在PySide中,最强大的解决方案可能就是:

    def slot(self, checked=False):

答案 1 :(得分:0)

我可以确认这种行为。我也看到没有传递checked参数。

QAction.triggered的{​​{3}}有一个默认(checked=False)参数。也许这意味着有时候没有和额外的参数调用信号然后检查应该是假的。

另一方面,我做了一个小例子,发现永远不会有额外的参数,虽然偶尔检查应该是True(如果已经检查过),documentation也应该说。< / p>

所以我想最好的方法是删除那个已检查的参数,如果需要,请拨打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