我正在重构一些使用旧式信号和插槽的代码,其中一件事就是将内置信号作为字符串传递(例如,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'
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章。
相关问题:
答案 0 :(得分:6)
这个怎么样?
getattr(widget, signalName).connect(slot)
您可能需要事先添加if hasattr(...)
检查,以确保信号确实存在。