PyQt5:根据文档,一个信号而不是两个

时间:2015-03-05 19:27:33

标签: python pyqt python-3.3 signals-slots pyqt5

我一直在阅读this PyQt5 documentation page上的“按名称连接插槽”部分,它基本上描述了新的信号和插槽功能。这件作品引起了我的注意:

  

例如,QtGui.QSpinBox类具有以下信号:

void valueChanged(int i);
void valueChanged(const QString &text);
     

当旋转框的值改变时,将发出这两个信号。

所以我草拟了以下脚本来测试这种双重调用行为:

#!/usr/bin/env python3

from PyQt5 import QtCore, QtGui
from PyQt5.QtWidgets import QMainWindow, QSpinBox

class Test(QMainWindow):

    def __init__(self):
        super().__init__()

        self.spb = QSpinBox()
        self.spb.valueChanged.connect(self.onValueChanged)
        self.setCentralWidget(self.spb)

    def onValueChanged(self, x):
        print("QSpinBox: value changed! " + str(x))

if __name__ == "__main__":
    import sys
    from PyQt5.QtWidgets import QApplication

    app = QApplication(sys.argv)
    t = Test()
    t.show()

    sys.exit(app.exec_())

在我看来,只有一个信号正在通过。我错过了什么?请注意,我是一个完整的PyQt菜鸟。

2 个答案:

答案 0 :(得分:2)

您只连接到两个信号过载中的一个。

由于您还没有指定您想要的重载,因此会选择默认值 - 在这种情况下将为valueChanged(int)

要明确选择两个重载,您需要执行以下操作:

    self.spb.valueChanged[int].connect(self.onValueChanged)
    self.spb.valueChanged[str].connect(self.onValueChanged)
    ...

def onValueChanged(self, x):
    print("QSpinBox: value changed! ", x, type(x))

答案 1 :(得分:2)

另请注意,文档是按名称讨论插槽,因此您应首先在旋转框中添加名称。

self.spb.setObjectName("spb")

然后,连接所有插槽:

QtCore.QMetaObject.connectSlotsByName(self)

最后使用on_widgetName_signalName表格创建广告位。

def on_spb_valueChanged(self, x):
    print("QSpinBox: value changed! " + str(x))

现在将被调用两次。

使用pyqtSlot装饰器指示您想要接收哪个信号。

@QtCore.pyqtSlot(int)
def on_spb_valueChanged(self, x):

或者...

@QtCore.pyqtSlot(str)
def on_spb_valueChanged(self, x):

希望它有所帮助。