Python PyQt将信号连接到多个插槽
我正在尝试学习使用python和qt进行的Python PyQt将信号连接到多个插槽,python,qt,pyqt4,Python,Qt,Pyqt4,我正在尝试学习使用python和qt进行的快速gui编程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, S
快速gui编程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()
我在这里试图实现的是在发出ValueChanged(int)
信号后立即调用2个slot,即spinbox.setValue
和getValue\u dial
对象
上述代码在没有任何错误的情况下成功执行,并在更改时打印相应的值
现在我的问题是,上述方法是否适合为单个信号调用多个插槽
上述两条语句(1和2)能否合并为一条语句
这是我的链接。这是合适的方式,是的。您不能将两个CONNECT语句组合成一个。您这样做很好。如果你有很多事情要做,你可以连接到一个新的函数,为你处理一切
我注意到在连接的getValue
函数中,直接从对象获取值;您是否知道该值是通过valueChanged(int)
信号作为参数传递的?如果将getValue
函数更改为接受附加参数,则无需直接从对象获取值。当然,您可以同时取消getValue
函数,并在helper函数中发出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
另外,这取决于偏好,有一个可以使代码更容易阅读的方法。这将改变世界
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)
但是对于最初的问题和您正在做的两件事,我只连接两次信号,而不是使用一个helper函数。您可以使用一个列表在一条语句中连接两个插槽/函数:
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
# 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]]
谢谢这是一个很好的解释,我知道当拨号值改变时,这个信号会以新值作为参数发出,但是我们如何能够直接作为变量值
访问该值呢。我的意思是,我们不需要一些拨号
对象特定的调用。为什么仅仅通过变量名值
就可以访问它。QDial继承自QAbstractSlider。在中,您可以看到valueChanged
在发出时传递一个int,并且int是滑块的值。