2017-09-25 222 views
0

我是Python和Qt的新手。目前,我正在嘗試爲更大的應用程序構建用戶界面,但我遇到了有關信號和插槽的問題。pyQt5:無法連接QSpinBox :: valueChanged(int)

這裏是我的代碼:

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)。應用程序啓動,但值改變時沒有任何反應。

非常感謝您的幫助!

回答

1

你的代碼有2個錯誤,第一個是插槽只在繼承自QObject的類中實現,所以最簡單的事情是你的類繼承自QObject。在進行上一次更改後,您將看到第二個問題,即使您更改QSpinBox的值也不會被調用到該插槽,並且發生這種情況的原因是收集器刪除row1類的row1類,因此解決方案是簡單地說,你只需要通過自己使排成爲班級的成員,即,通過自己改變row1self.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)