请参考名称以字符串形式传递的信号(新式信号/插槽)?

时间:2014-08-05 19:27:51

标签: python qt pyqt pyside signals-slots

我正在重构一些使用旧式信号和插槽的代码,其中一件事就是将内置信号作为字符串传递(例如,signalName =" clicked()")另一个实际连接信号和插槽的功能。 E.g:

self.connect(widget, QtCore.SIGNAL(signalName), slot)

这很好用。问题是,转换为新式信号和插槽(信号不作为参数传递)会使这变得更加复杂。在新式信号和插槽中,上面的内容将

widget.[signalName].connect(slot)

[signalName]哪里有效。 :)在没有使用eval的情况下,工作了很多东西:

widget.signalName.connect(slot) #AttributeError: widget object has no attribute 'signalName'

基于a related post

signalDict={}
signalDict["clicked"]=QtGui.QAbstractButton.clicked
widget.signalDict["clicked"].connect(slot) #AttributeError: widget object has no attribute 'signalDict'

当然有eval,实际上有效:

fullCommand="widget." + signalName + ".connect(slot)"
eval(fullCommand)

但是它使用了eval,这有点令人不悦。有没有更好的方法将这些代码转换为新式信号和插槽,而不使用eval

请注意原始代码,我试图转换为新式信号和插槽,在这里: https://github.com/ghosert/VimProject/blob/master/pyqt/book_samples/chap06/imagechanger.pyw

这是Summerfield关于Qt编程的书的第6章。

相关问题:

Passing Arguments with Newstyle signals in PyQT

1 个答案:

答案 0 :(得分:6)

这个怎么样?

getattr(widget, signalName).connect(slot)

您可能需要事先添加if hasattr(...)检查,以确保信号确实存在。