pyQt5: 无法连接 QSpinBox::valueChanged(int)
pyQt5: Cannot connect QSpinBox::valueChanged(int)
我是 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)。应用程序启动,但更改值时没有任何反应。
提前感谢您的帮助!
您的代码有 2 个错误,第一个是插槽仅在继承自 QObject
的 class 中实现,所以最简单的是您的 class从 QObject
继承。第二个你会看到在做了之前的改变之后,即使你改变了 QSpinBox
的值也永远不会被调用到槽中,这是因为收集器删除了 row1
的对象DataRow
class 的解决方案很简单,你只需要通过自己使行成为 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)
我是 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)。应用程序启动,但更改值时没有任何反应。
提前感谢您的帮助!
您的代码有 2 个错误,第一个是插槽仅在继承自 QObject
的 class 中实现,所以最简单的是您的 class从 QObject
继承。第二个你会看到在做了之前的改变之后,即使你改变了 QSpinBox
的值也永远不会被调用到槽中,这是因为收集器删除了 row1
的对象DataRow
class 的解决方案很简单,你只需要通过自己使行成为 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)