PyQt将SIGNAL连接到多个SLOT

Ran*_*Rag 7 python qt pyqt4

我努力学习PyQt,从rapid gui programming with python and qt目前的学习SignalsSlots.

以下是我的代码的简短片段:

self.connect(self.dial, SIGNAL("valueChanged(int)"),self.spinbox.setValue) #1
self.connect(self.dial, SIGNAL("valueChanged(int)"),self.getValue_dial)    #2
self.connect(self.spinbox, SIGNAL("valueChanged(int)"),self.dial.setValue)
self.connect(self.spinbox, SIGNAL("valueChanged(int)"),self.getValue_spinbox)

def getValue_dial(self):
        print self.dial.value()

def getValue_spinbox(self):
        print self.dial.value()
Run Code Online (Sandbox Code Playgroud)

我想在这里实现的是呼叫2在插槽一次是spinbox.setValuegetValue_dialdial对象,一旦ValueChanged(int)信号被发射.

上面的代码成功执行,没有任何错误和print适当的值,因为它们被更改.

现在我的问题是以上适合为单个信号调用多个插槽的方法.

可以将上述两个语句(1和2)合并为一个语句.

这是我完整代码的链接.

Gar*_*hes 11

你这样做的方式很好.如果你有很多事情要做,你可以连接到一个新功能,为你处理一切.

我注意到你在连接getValue函数中直接从对象中获得了值; 你知道这个值是作为valueChanged(int)信号的参数传递的吗?如果将getValue函数更改为接受其他参数,则无需直接从对象获取值.当然,您可以getValue一起取消函数并在辅助函数中发出print语句.

self.connect(self.dial, SIGNAL("valueChanged(int)"), self.dial_value_changed)
self.connect(self.spinbox, SIGNAL("valueChanged(int)"),self.spinbox_value_changed)

def dial_value_changed(self, value):
    self.spinbox.setValue(value)
    self.getValue_dial(value)

def spinbox_value_changed(self, value):
    self.dial.setValue(value)
    self.getValue_spinbox(value)

def getValue_dial(self, value):
        print value

def getValue_spinbox(self, value):
        print value
Run Code Online (Sandbox Code Playgroud)

此外,这是优先考虑的,有一种新的信号和插槽样式,可以使代码更容易阅读.它会改变

self.connect(self.dial, SIGNAL("valueChanged(int)"), self.dial_value_changed)
self.connect(self.spinbox, SIGNAL("valueChanged(int)"),self.spinbox_value_changed)
Run Code Online (Sandbox Code Playgroud)

上面的行

self.dial.valueChanged.connect(self.dial_value_changed)
self.spinbox.valueChanged.connect(self.spinbox_value_changed)
Run Code Online (Sandbox Code Playgroud)

但是对于原始问题和你正在做的两件事我只是连接信号两次而不是辅助函数.


ale*_*sdm 5

您可以使用列表在单个语句中连接两个插槽/函数:

# in Python 2.X
map(self.dial.valueChanged.connect, [self.spinbox.setValue, self.getValue_dial])

# in Python 3.X (map returns an iterator instead of processing the list)
list(map(self.dial.valueChanged.connect, [self.spinbox.setValue, self.getValue_dial]))

# or with any Python version
[self.dial.valueChanged.connect(x) for x in [self.spinbox.setValue, self.getValue_dial]]
Run Code Online (Sandbox Code Playgroud)