Emit python list in Signal to Qml ui

Question:

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.

Asked By: codeKiller

||

Answers:

[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(`------------`);
        }
    }
}
Answered By: Stephen Quan
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.