【问题标题】:PyQt connect SIGNAL to multiple SLOTPyQt 将 SIGNAL 连接到多个 SLOT
【发布时间】:2012-05-18 13:37:25
【问题描述】:

我正在尝试从rapid gui programming with python and qt 学习PyQt,目前正在学习SignalsSlots

以下是我的代码的简短 sn-p:

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) 信号后立即调用spinbox.setValuegetValue_dialdial 对象的SLOTS。

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

现在我的问题是上述方式适合为单个信号调用多个插槽。?

以上两个语句(1 & 2)能否合并成一个语句。

这是我的complete code的链接。

【问题讨论】:

    标签: python qt pyqt4


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢。一个很好的解释
    • 好的,我知道当拨号值发生变化时,这个信号会以新值作为参数发出,但是我们如何能够直接访问该值作为变量value。我的意思是我们不需要一些dial对象特定的调用。我们怎么能只通过变量名value来访问它。
    • QDial 继承自 QAbstractSlider。在documentation 中,您可以看到valueChanged 在发出时传递了一个int,并且该int 是滑块的值。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      这是适当的方式,是的。你can't combine将两个CONNECT语句合二为一。

      【讨论】:

        猜你喜欢
        • 2016-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-16
        • 1970-01-01
        相关资源
        最近更新 更多