Search code examples
pythonqmlpyside6

Emit python list in Signal to Qml ui


I am trying to communicate a python script to a qml ui using signal/slot and, while it works for some types (str) it seems to not be working when I try emitting a list:

Python:

from PySide6.QtCore import QObject, Signal, Slot
from PySide6.QtGui import QGuiApplication
from PySide6.QtQml import QQmlApplicationEngine
import time, sys

class PythonSignalEmitter(QObject):
    
    getListTest = Signal(list)
    @Slot()
    def callList(self):
        print("HELLO from python ")
        test = ["a", "b", "c"]
        self.getListTest.emit(test)


if __name__ == '__main__':
    app = QGuiApplication([])
    engine = QQmlApplicationEngine()
    signal_emitter = PythonSignalEmitter()

    engine.rootContext().setContextProperty("signalEmitter", signal_emitter)
    engine.load("main.qml")
    sys.exit(app.exec())

Fragment of the main.qml file:

Connections {
        target: signalEmitter
        function onSignal(res) {
            console.log(`------------`);
            console.log(`qml list is ${res}`);
            console.log(`------------`);    
        }
    }

The output of this just gives:

HELLO from python 

So the app runs with no problem, and after a click on a specified component, the slot is called, but the log in the QLM side is not even printed, seems like the signal is not even emitted.


Solution

  • [EDIT]

    You need to rename onSignal with onGetListTest. The rest is fine.

    import QtQuick
    import QtQuick.Layouts
    import QtQuick.Controls
    import QtQuick.Window
    
    ApplicationWindow {
        id: main
        title: qsTr("Hello World")
        width: 640
        height: 480
        visible: true
    
        Frame {
            anchors.centerIn: parent
            RowLayout {
                Button {
                    text: qsTr("Quit")
                    onClicked: Qt.callLater(Qt.quit)
                }
                Button {
                    text: qsTr("Test")
                    onClicked: signalEmitter.callList()
                }
            }
        }
    
        Connections {
            target: signalEmitter
            function onGetListTest(res) {
                console.log(`------------`);
                console.log(`qml list is ${res}`);
                console.log(`------------`);
            }
        }
    }