Ни одно из решений Алекса Нора Раджа действительно не отвечает на вопрос. Алекс состоит в том, чтобы вызывать непосредственно из кода javascript метод слота QML, а раджа состоит в том, чтобы устанавливать значение свойства объекта QML из кода Javascript. Оба подхода сводят на нет главное преимущество механизма сигнал / слот, заключающееся в том, что объект сигнализации не должен знать о слоте.
Подход, более близкий к духу механизма сигнал / слот, описан в этом сообщении в блоге (не моё). В файле javascript он состоит из создания объекта QML (с помощью функции Qt.createQmlObject()
), единственной функцией которого является хранение объектных сигналов javascript. Сигналы передаются из javascript посредством вызова внутреннего сигнала объектов QML (например, internalQmlObject.signalName()
), и сигнал объекта javascript может быть подключен в QML к слотам QML с помощью обычного механизма connect
через javascriptObject.internalQmlObject.signalName.connect(receiver.slotName)
.
Пример, адаптированный из сообщения в блоге, приведен ниже:
javascript_object.js:
var internalQmlObject = Qt.createQmlObject('import QtQuick 2.0; QtObject { signal someSignal(int value) }', Qt.application, 'InternalQmlObject');
function doSomething() {
internalQmlObject.someSignal(42);
}
test.qml:
import QtQuick 2.0
import 'javascript_object.js' as JavascriptObject
Rectangle {
Rectangle {
id: someComponent
function someSlot(v) {
console.log("Signal received " + v);
}
}
Component.onCompleted: {
JavascriptObject.internalQmlObject.someSignal.connect(someComponent.someSlot);
JavascriptObject.doSomething();
}
}
На исполнение выдает следующее:
% qmlscene test.qml
Signal received 42