【问题标题】:pyQt5: Cannot connect QSpinBox::valueChanged(int)pyQt5:无法连接 QSpinBox::valueChanged(int)
【发布时间】:2018-03-06 14:39:47
【问题描述】:

我是 Python 和 Qt 的新手。目前,我正在尝试为更大的应用程序构建 UI,但我遇到了有关信号和插槽的问题。

这是我的代码:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import QObject, pyqtSlot
import sys


class Ui_configDialog(QtWidgets.QDialog):
    def __init__(self):
        super(Ui_configDialog, self).__init__()

        self.setupUi()

    def setupUi(self):
        self.setObjectName("configDialog")
        self.setWindowModality(QtCore.Qt.WindowModal)
        self.resize(425, 380)

        row1 = DataRow(self)

        self.show()


class DataRow:
    def __init__(self, dialog):
        rect = QtCore.QRect(10, 40, 91, 30)

        self.text_fRep = QtWidgets.QSpinBox(dialog)
        self.text_fRep.setGeometry(rect.translated(100, 0))
        self.connect_signal()

    @pyqtSlot(int)
    def fRep_changed(self, value):
        print(value)

    def connect_signal(self):
        self.text_fRep.valueChanged.connect(self.fRep_changed)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    dialog = Ui_configDialog()
    sys.exit(app.exec_())

我想要实现的是,只要 QSpinBox 对象的值发生更改,就会调用插槽 fRep_changed。但是使用这段代码我收到一个编译错误:

QObject::connect: Cannot connect QSpinBox::valueChanged(int) to (null)::fRep_changed(int)
TypeError: connect() failed between valueChanged(int) and fRep_changed()

我看不到,为什么我不能将信号连接到插槽。

我还删除了@pyqtSlot(int)。应用程序启动,但值更改时没有任何反应。

提前感谢您的帮助!

【问题讨论】:

    标签: python pyqt pyqt5 qspinbox


    【解决方案1】:

    您的代码有2个错误,第一个是插槽仅在继承自QObject的类中实现,因此最简单的方法是让您的类继承自QObject。在进行上一次更改后,您将看到第二个,即使您更改了QSpinBox 的值,也永远不会调用槽,这是因为收集器删除了@987654325 的row1 的对象@class,解决方法很简单,只要通过self把row变成class的成员,即把row1改成self.row1

    class Ui_configDialog(QtWidgets.QDialog):
        def __init__(self):
            super(Ui_configDialog, self).__init__()
    
            self.setupUi()
    
        def setupUi(self):
            self.setObjectName("configDialog")
            self.setWindowModality(QtCore.Qt.WindowModal)
            self.resize(425, 380)
    
            self.row1 = DataRow(self)
    
            self.show()
    
    
    class DataRow(QObject):
        def __init__(self, dialog, parent=None):
            QObject.__init__(self, parent)
    
            rect = QtCore.QRect(10, 40, 91, 30)
    
            self.text_fRep = QtWidgets.QSpinBox(dialog)
            self.text_fRep.setGeometry(rect.translated(100, 0))
            self.connect_signal()
    
        @pyqtSlot(int)
        def fRep_changed(self, value):
            print(value)
    
        def connect_signal(self):
            self.text_fRep.valueChanged.connect(self.fRep_changed)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-30
      • 1970-01-01
      • 2020-12-13
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 2020-02-07
      相关资源
      最近更新 更多