我最近开始使用新的pySide信号和插槽,我发现我需要很多代码来处理它们。我想我做错了什么,希望有人有更好的方法。
#first I need to declare it at the class level
class UI(QtGui.QMainWindow):
my_signal = QtCore.Signal(str, str)
# next I need to connect it to something in the UI
self.my_signal.connect(self._mySignalHandler)
# then I need the actual handler that does the work:
@QtCore.Slot(str, str)
def _mySignalHandler(self, a, b):
pass
# and finally I needs an accessor method for it to use it from the outside the UI class:
def mySignalAccessor(self, a, b):
self.my_signal.emit(a, b)
这是做很多简单事情的很多代码。我最终有两个方法和一个所有类似的变量 - 非常好的方式让你完全迷失在bug中。你有更好的方法吗?
答案 0 :(得分:0)
它只有三行代码:定义,连接,处理程序。访问器是冗余的(只需给信号一个好的描述性名称,并像任何其他内置信号一样使用它)。
你可以摆脱插槽装饰器,这通常不是必需的(信号可以连接到任何Python可调用,它不必是一个插槽)。
至于命名:只需选择一种格式,并在所有项目中坚持使用。例如:
dataReceived = QtCore.Signal(object)
self.dataReceived.connect(self.handleDataReceived)
def handleDataReceived(self, data):
如果编辑器支持这种事情,可以通过模板轻松插入像这样的锅炉代码。
PS:
在PyQt中,支持Connecting Slots By Name - 我自己从未使用过它,我也不知道它是否也支持PySide,但你可能会发现它是有用的。