Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/412.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将信号从javascript发送到qml_Javascript_Qt_Qt4_Qml_Qt Quick - Fatal编程技术网

如何将信号从javascript发送到qml

如何将信号从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

我想从javascript文件发出信号,并在qml文件中接收它(以确定耗时的操作何时完成)

我怎么做?

谢谢你,@RajaVarma

我为自己找到了解决办法

qml文件中:创建元素项(my loginItem),其中包含扮演插槽角色的函数。 例如(我需要知道何时处理登录事件):

在js文件中:为loginItem创建接收器并使用它

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
}