How to connect PyQt5 pyqtSlot to QML ListView signal "activated"? How to connect PyQt5 pyqtSlot to QML ListView signal "activated"? python-3.x python-3.x

How to connect PyQt5 pyqtSlot to QML ListView signal "activated"?


You can do that by using QQuickView instead of QQmlApplicationEngine.

I changed your python script to add a new class which inherits from QQuickView, and added a signal to the QML object named "myList".

Moreover, into the QML I removed the Window type for Item type (you can't use Window with QQuickView). If you want to display your application in full screen, you'll have to specify it into MyView class.In the example, if you click on one of the colored rectangles, the index will be displayed in the console.

list.py:

import sysfrom PyQt5.QtCore import QUrl, QObjectfrom PyQt5.QtWidgets import QApplication, QListViewfrom PyQt5.QtQuick import QQuickView, QQuickItemclass MyView(QQuickView):    def __init__(self, parent=None):        super().__init__(parent)        # Load the QML scene from file        self.setSource(QUrl('List.qml'))            #connect signal and source        list = self.rootObject().findChild(QQuickItem, 'myList')        list.mySignal.connect(self.mySlot)    def mySlot(self, index):        print(index)# Main Functionif __name__ == '__main__':    # Create main app    app = QApplication(sys.argv)    # Create QML view    view = MyView()    view.show()        # Execute the application and exit    sys.exit(app.exec_())

List.qml:

import QtQuick 2.0import QtQuick.Window 2.2Item {  width: 500  height: 500  ListView {    anchors.fill: parent    id: list    objectName: "myList"    signal mySignal(int index)    delegate: Item {      width: parent.width * 0.8      height: 40      Row {        id: row1        Rectangle {          width: 40          height: 40          color: colorCode          MouseArea{            anchors.fill: parent            onClicked: list.mySignal(index)          }        }        Text {          text: name          font.bold: true          anchors.verticalCenter: parent.verticalCenter        }        spacing: 10      }    }    model: ListModel {      ListElement {        name: "Grey"        colorCode: "grey"      }      ListElement {        name: "Red"        colorCode: "red"      }      ListElement {        name: "Blue"        colorCode: "blue"      }      ListElement {        name: "Green"        colorCode: "green"      }    }  }}