【问题标题】:PyQt5: one signal comes instead of two as per documentationPyQt5:根据文档,一个信号而不是两个
【发布时间】:2015-05-07 07:22:04
【问题描述】:

我一直在阅读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 noob。

【问题讨论】:

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


    【解决方案1】:

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

    由于您也没有指定 哪个 您想要的重载,因此将选择默认值 - 在本例中为 valueChanged(int)

    要显式选择 both 重载,您需要执行以下操作:

        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))
    

    【讨论】:

      【解决方案2】:

      另请注意,文档是按名称讨论插槽的,因此您应该首先为您的 spinbox 添加一个名称。

      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):
      

      希望对你有帮助。

      【讨论】:

      • 但关键是必须使用pyqtSlot装饰器来指定需要哪个重载。获得多个信号几乎总是一个错误 - 例如,请参阅Why is PyQt Executing my actions 3 times?(可能还有其他几个类似的 SO 问题)。
      • @ekhumoro 我同意,但标题是“PyQt5:根据文档,一个信号来了,而不是两个”。如文档所述,这是接收两个信号而不是一个信号的方法。我只是添加一些信息。
      • 我认为 OP 只是在测试看看实际发生了什么。无论如何,我只是建议您可以添加一些关于pyqtSlot 的信息,因为这将很好地补充我的答案(即展示两种不同的方法来实现相同的目标)。
      猜你喜欢
      • 2016-07-28
      • 1970-01-01
      • 2020-05-30
      • 1970-01-01
      • 1970-01-01
      • 2019-07-31
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      相关资源
      最近更新 更多