2017-09-25 2 views
0

저는 Python과 Qt를 처음 사용합니다. 현재, 더 큰 응용 프로그램을위한 UI를 구현하려고하지만 신호와 슬롯에 관한 문제가 있습니다.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의 값을 변경하더라도 슬롯에 호출되지 않으며 콜렉터가 DataRow 클래스의 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) 
관련 문제