PyQt连接信号到多个插槽

2024-09-30 07:32:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从rapid gui programming with python and qt中学习PyQt,目前正在学习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()

我在这里试图实现的是,一旦发出ValueChanged(int)信号,立即调用2插槽,即spinbox.setValuegetValue_dial作为dial对象。

上述代码成功执行,没有任何错误,并且print更改了相应的值。

现在我的问题是,上述方法适合于为一个信号调用多个时隙。?

能否将上述两个语句(1&2)合并为一个语句。

这是我的complete code的链接。


Tags: 代码selfsignal信号valuedefconnect语句
3条回答

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

# 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]]

你这样做很好。如果你有很多事情要做,你可以连接到一个新的函数,为你处理一切。

我注意到在连接的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

另外,这取决于偏好,有一个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)

但对于最初的问题和您正在做的两件事,我只需要连接两次信号,而不是有一个helper函数。

是的,这是正确的方法。您可以将两个CONNECT语句合并成一个。

相关问题 更多 >

    热门问题