ale*_*yuk 5 javascript qt qt4 qml qt-quick
我想从javascript文件中发出信号并在qml文件中接收它(要查找耗时的操作何时完成).
我该怎么做?
亚历克斯的诺尔拉贾的解决方案都没有真正回答这个问题.Alex's包括直接从javascript代码调用QML插槽方法,而Raja包括从Javascript代码设置QML对象的属性值.两种方法都否定了信号/时隙机制的主要优点,即信令对象不需要知道时隙.
本博客文章(不是我的)中描述了更接近信号/槽机制精神的方法.它在javascript文件中包含创建QML对象(通过Qt.createQmlObject()函数),其唯一的功能是包含javascript的对象信号.通过调用内部QML对象信号(例如internalQmlObject.signalName())从javascript发出信号,并且javascript对象信号可以通过常规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);
}
Run Code Online (Sandbox Code Playgroud)
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();
}
}
Run Code Online (Sandbox Code Playgroud)
执行时,它提供以下内容:
% qmlscene test.qml
Signal received 42
Run Code Online (Sandbox Code Playgroud)
谢谢你,@RajaVarma。
我为自己找到了解决方案。
在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
...
}
}
Run Code Online (Sandbox Code Playgroud)
在js-file 中:为 loginItem 创建接收器并使用它。
var loginItem;
function setLoginItem(tempLoginItem) {
loginItem = tempLoginItem;
}
...
// Emit "signal"
loginItem.logged();
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11044 次 |
| 最近记录: |