如何将信号从javascript发射到qml
如何将信号从javascript发射到qml
https://stackoverflow.com/questions/8696448/how-to-emit-signals-from-javascript-to-qml
我想从javascript文件中发出信号并在qml文件中接收它(以查找耗时的操作何时完成)。
-------------------------------------
亚历克斯(Alex)的野蛮拉贾(Raja)的解决方案都没有真正回答这个问题。Alex的工作包括直接从javascript代码中调用QML slot方法,而Raja的工作在于从Javascript代码中设置QML对象的属性值。两种方法都否定了信号/时隙机制的主要优点,即信令对象不需要知道时隙。
此博客文章(不是我的文章)中描述了一种更接近信号/插槽机制的精神的方法。它在javascript文件中包含创建QML对象(通过Qt.createQmlObject()
函数),该对象的唯一功能是包含javascript的对象信号。通过调用内部QML对象信号(例如internalQmlObject.signalName()
)从javascript发出信号,并且javascript对象信号可以通过QML connect
通过常规机制通过QML连接到QML插槽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
-------------------------------------
我为自己找到了解决方案。
在qml-file中:创建元素Item(我的loginItem),其中包含充当插槽角色的功能。例如(我需要知道何时处理登录事件):
import "scripts/auth.js" as Auth
...
Item {
id: loginItem
// Send himself to javascript module named Auth
Component.onCompleted: {
Auth.setLoginItem(loginItem);
}
// "Slot" function
function logged() {
console.debug("Login successfully");
// Do something
...
}
}
在js-file中:为loginItem创建接收器并使用它。
var loginItem;
function setLoginItem(tempLoginItem) {
loginItem = tempLoginItem;
}
...
// Emit "signal"
loginItem.logged();
...
嗯,从真实的JS文件中调用信号非常困难。但是,还有一个更好的选择,恕我直言,我自己使用了它。创建自己的示例。
MyClass.qml
import QtQuick 2.0
QtObject
{
property var myVariable
function myFunction() { console.log("emitting signal"); mySignal() }
signal mySignal
}
这样,您可以轻松实现所需的封装。您甚至可以很好地连接到对象。
然后,您可以使用它进行任何操作:从中创建单例,创建全局对象,实例化它。
================= End