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

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

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

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

For example the QtGui.QSpinBox class has the following signals:

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

When the value of the spin box changes both of these signals will be emitted.

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

#!/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_())

在我看来只有一个信号通过。我错过了什么?请注意,我是个十足的无赖。在


Tags: thefromimportself信号syspyqt5class
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))

还要注意,文档是按名称讨论插槽的,因此您应该首先向数字调整框添加名称。在

self.spb.setObjectName("spb")

然后,连接所有插槽:

^{pr2}$

最后使用on_widgetName_signalName表单创建插槽。在

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

现在会叫两次。在

使用pyqtSlot修饰符指示要接收的信号。在

^{4}$

或者。。。在

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

希望有帮助。在

相关问题 更多 >

    热门问题