如何将信号从javascript发送到qml
我想从javascript文件发出信号,并在qml文件中接收它(以确定耗时的操作何时完成) 我怎么做?谢谢你,@RajaVarma 我为自己找到了解决办法 在qml文件中:创建元素项(my loginItem),其中包含扮演插槽角色的函数。 例如(我需要知道何时处理登录事件): 在js文件中:为loginItem创建接收器并使用它如何将信号从javascript发送到qml,javascript,qt,qt4,qml,qt-quick,Javascript,Qt,Qt4,Qml,Qt Quick,我想从javascript文件发出信号,并在qml文件中接收它(以确定耗时的操作何时完成) 我怎么做?谢谢你,@RajaVarma 我为自己找到了解决办法 在qml文件中:创建元素项(my loginItem),其中包含扮演插槽角色的函数。 例如(我需要知道何时处理登录事件): 在js文件中:为loginItem创建接收器并使用它 var loginItem; function setLoginItem(tempLoginItem) { loginItem = tempLoginIte
var loginItem;
function setLoginItem(tempLoginItem) {
loginItem = tempLoginItem;
}
...
// Emit "signal"
loginItem.logged();
...
Alex的nore Raja的解决方案都不能真正回答这个问题。Alex的工作是直接从javascript代码调用QML插槽方法,Raja的工作是从javascript代码中设置QML对象的属性值。这两种方法都否定了信号/时隙机制的主要优点,即信令对象不需要知道时隙 本文(不是我的)描述了一种更接近信号/插槽机制精神的方法。它包括在javascript文件中创建一个QML对象(通过
Qt.createQmlObject()
函数),其唯一功能是包含javascript的对象信号。javascript通过调用内部QML对象信号(例如,internalQmlObject.signalName()
)从javascript发出信号,javascript对象信号可以通过javascriptObject.internalQmlObject.signalName.connect(receiver.slotName)
在QML到QML插槽中通过通常的connect
机制连接
根据博客文章改编的示例如下:
javascript_object.js:
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
接收到的信号42
好吧,从一个真正的JS文件调用信号是非常不礼貌的。但是有一个更好的选择,伊姆霍,我自己用它来代替。创建自己的类
MyClass.qml
import QtQuick 2.0
QtObject
{
property var myVariable
function myFunction() { console.log("emitting signal"); mySignal() }
signal mySignal
}
通过这种方式,您可以轻松实现所需的封装。您甚至可以很好地连接到对象
然后你可以用它做任何你想做的事情:从它创建一个单例,创建一个全局对象,实例化它。与问题无关,但它是“登录”的,而不是“登录的”;)我为我的英语感到抱歉。我答应这个月上语言课,我同意。很好的解决方案。
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();
}
}
import QtQuick 2.0
QtObject
{
property var myVariable
function myFunction() { console.log("emitting signal"); mySignal() }
signal mySignal
}