Why does pyqtSlot decorator cause “TypeError: connect() failed”?

后端 未结 2 585
慢半拍i
慢半拍i 2021-01-12 12:20

I have this Python 3.5.1 program with PyQt5 and a GUI created from a QtCreator ui file where the pyqtSlot decorator causes \"TypeError: connect() failed between textChanged(

相关标签:
2条回答
  • 2021-01-12 12:36

    I don't know what was wrong, but I found a workaround: Connect the textChanged signal to a pyqtSlot decorated MainApp method that calls LineEditHandler.edited():

    import sys
    from PyQt5 import uic
    from PyQt5.QtWidgets import *
    from PyQt5.QtCore import pyqtSlot
    
    
    Ui_MainWindow, QtBaseClass = uic.loadUiType("mainwindow.ui")
    
    
    class MainApp(QMainWindow, Ui_MainWindow):
    
        def __init__(self):
            # noinspection PyArgumentList
            QMainWindow.__init__(self)
            Ui_MainWindow.__init__(self)
            self.setupUi(self)
    
            # Instantiate the QLineEdit handler.
            self._line_edit_handler = LineEditHandler(self, self.lineEdit)
            self.lineEdit.textChanged.connect(self._line_edited)
    
            @pyqtSlot(name="_line_edited")
            def _line_edited(self):
                self._line_edit_handler.edited()
    
    class LineEditHandler:
    
        def __init__(self, main_window, line_edit_obj):
            self._line_edit = line_edit_obj
            self._main_window = main_window
    
        def edited(self):
            # Copy the entry box text to the label box below.
            self._main_window.label.setText(self._line_edit.text())
    
    
    def main():
        app = QApplication(sys.argv)
        window = MainApp()
        window.show()
        sys.exit(app.exec_())
    
    
    if __name__ == "__main__":
        main()
    
    0 讨论(0)
  • 2021-01-12 12:52

    Why do you want to use @pyqtSlot?

    The reason it fails is that LineEditHandler is not a QObject. What @pyqtSlot does is basically creating a real Qt slot instead of internally using a proxy object (which is the default behavior without @pyqtSlot).

    0 讨论(0)
提交回复
热议问题