如何将信号从javascript发送到qml

ale*_*yuk 5 javascript qt qt4 qml qt-quick

我想从javascript文件中发出信号并在qml文件中接收它(要查找耗时的操作何时完成).

我该怎么做?

JB *_*ohn 7

亚历克斯的诺尔拉贾的解决方案都没有真正回答这个问题.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)


ale*_*yuk 5

谢谢你,@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)

  • 我为我的英语感到抱歉。我保证这个月去上语言课。 (4认同)