Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyQt将信号连接到多个插槽_Python_Qt_Pyqt4 - Fatal编程技术网

Python PyQt将信号连接到多个插槽

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

我正在尝试学习使用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, 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是滑块的值。