Reputation: 9555
I've noticed that QML can receive a signal emitted from Python by using the Connections object. Unfortunately, I can't figure out how to get that object to receive the arguments of that signal.
I've created a minimal test case that demonstrates what I want to do:
min.py
from PySide import QtCore, QtGui, QtDeclarative
import sys
# init Qt
app = QtGui.QApplication(sys.argv)
# set up the signal
class Signaller(QtCore.QObject):
emitted = QtCore.Signal(str)
signaller = Signaller()
# Load the QML
qt_view = QtDeclarative.QDeclarativeView()
context = qt_view.rootContext()
context.setContextProperty('signaller', signaller)
qt_view.setResizeMode(QtDeclarative.QDeclarativeView.SizeRootObjectToView)
qt_view.setSource('min.qml')
qt_view.show()
# launch the signal
signaller.emitted.emit("Please display THIS text!")
# Run!
app.exec_()
And min.qml
import QtQuick 1.0
Rectangle {
width:300; height:100
Text {
id: display
text: "No signal yet detected!"
Connections {
target: signaller
onEmitted: {
display.text = "???" //how to get the argument?
}
}
}
}
Upvotes: 6
Views: 3012
Reputation: 11
Sorry i can't comment since i need to have higher reputation. In response to the "Cannot assign to non-existent property", it's caused by the order in which you initialize your application. Your root context object needs to be created before the engine.
Ok:
context = Context()
engine = QQmlApplicationEngine()
engine.rootContext().setContextProperty("context", context)
Not ok:
engine = QQmlApplicationEngine()
context = Context()
engine.rootContext().setContextProperty("context", context)
Upvotes: 0
Reputation: 645
As of Qt for Python versions 5.12.5, 5.13.1 it is working the same as in PyQt:
from PySide2.QtCore import Signal
sumResult = Signal(int, arguments=['sum'])
sumResult.emit(42)
QML:
onSumResult: console.log(sum)
Upvotes: 6
Reputation: 29896
As of Qt 4.8, PySide doesn't handle signal parameter names at all.
But you can create a QML signal with named parameters and connect your python signal to it using Javascript:
import QtQuick 1.0
Rectangle {
width:300; height:100
Text {
id: display
text: "No signal yet detected!"
signal reemitted(string text)
Component.onCompleted: signaller.emitted.connect(reemitted)
onReemitted: {
display.text = text;
}
}
}
Upvotes: 5