2017-09-25 1 views
0

Ich bin neu in Python und Qt. Derzeit versuche ich, die Benutzeroberfläche für eine größere Anwendung zu erstellen, aber ich habe Probleme mit Signalen und Slots.pyQt5: Kann nicht verbinden QSpinBox :: valueChanged (int)

Hier ist mein Code:

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

Was ich versuche zu erreichen, dass der Schlitz fRep_changed wird aufgerufen, wenn der Wert des QSpinBox Objekts geändert wird. Aber mit diesem Code erhalte ich einen Compiler-Fehler:

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

Ich kann nicht sehen, warum soll ich nicht in der Lage sein, das Signal zu dem Schlitz zu verbinden.

Ich entfernte auch den @pyqtSlot (int). Die Anwendung startet, aber nichts passiert, wenn der Wert geändert wird.

Vielen Dank für Ihre Hilfe im Voraus!

Antwort

1

Ihr Code hat 2 Fehler, der erste ist, dass die Steckplätze nur innerhalb der Klassen implementiert werden, die von QObject erben, also ist es am einfachsten, dass Ihre Klasse von QObject erbt. Die zweite, die Sie sehen, nachdem Sie die vorherige Änderung vorgenommen haben, wird passieren, dass, selbst wenn Sie den Wert von QSpinBox nie in den Steckplatz aufgerufen werden, und dies geschieht, weil der Kollektor das Objekt row1 der DataRow Klasse löscht, ist die Lösung einfach, Sie müssen nur Zeile ein Mitglied der Klasse durch Selbst machen, dh Änderung row1 von 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) 
Verwandte Themen