我正在尝试通过 使用 python 和 qt 进行快速图形用户界面编程
来学习 PyQt
,目前正在学习 Signals
和 Slots
.
下面是我的一小段代码:
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()
我在这里想要实现的是立即调用 2
SLOTS,即 spinbox.setValue
和 getValue_dial
for dial
对象,一旦发出 ValueChanged(int)
信号。
上面的代码成功执行,没有任何错误,并且在更改时打印
适当的值。
现在我的问题是上述方法是否适合为单个信号调用多个槽?
可以将以上两个语句(1 和 2)组合成一个语句吗?
这是我的 complete code 的链接.
最佳答案
你这样做的方式很好。如果您有很多事情要做,您可以连接到一个新函数来为您处理所有事情。
我注意到在您连接的 getValue
函数中,您直接从对象中获取值;您是否知道该值是通过 valueChanged(int)
信号作为参数传递的?如果您更改 getValue
函数以接受附加参数,则无需直接从对象获取值。当然,您可以完全取消 getValue
函数,并在辅助函数中发出打印语句。
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
此外,这取决于偏好,有一个 new style for signals and slots这可以使代码更容易阅读。它将改变
self.connect(self.dial, SIGNAL("valueChanged(int)"), self.dial_value_changed)
self.connect(self.spinbox, SIGNAL("valueChanged(int)"),self.spinbox_value_changed)
上面的行
self.dial.valueChanged.connect(self.dial_value_changed)
self.spinbox.valueChanged.connect(self.spinbox_value_changed)
但对于最初的问题和您正在做的两件事,我只是连接信号两次而不是使用辅助函数。
关于python - PyQt 连接 SIGNAL 到多个 SLOT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10653704/