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

原文地址:https://www.cnblogs.com/lsgxeva/p/12636882.html