【发布时间】:2014-09-28 14:04:12
【问题描述】:
我正在重构一些使用旧式信号和槽的代码,它所做的一件事是将内置信号作为字符串(例如,signalName="clicked()")传递给另一个实际连接信号和插槽。例如:
self.connect(widget, QtCore.SIGNAL(signalName), slot)
这很好用。问题是,转换为新型信号和槽(其中信号不作为参数传递)会使这变得更加复杂。在新式的信号和槽中,上面会是 something 像:
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 章。
相关问题:
【问题讨论】:
-
使用
signalDict["clicked"] = QtGui.QAbstractButton.clicked而不是signalDict["clicked"]=QtGui.QAbstractButton.clicked()。
标签: python qt pyqt pyside signals-slots