2012-01-02 98 views

回答

6

Alex的nore Raja的解决方案都没有真正回答这个问题。 Alex's直接从javascript代码调用QML插槽方法,Raja的功能在于通过Javascript代码设置QML对象的属性值。两种方法都不利于信号/时隙机制的主要优点,即信令对象不需要知道时隙。

这个blog post(不是我的)描述了一种更接近信号/插槽机制精神的方法。它包含在javascript文件中创建一个QML对象(通过Qt.createQmlObject()函数),其唯一功能是包含javascript的对象信号。通过调用内部QML对象信号(例如internalQmlObject.signalName())从javascript发出信号,并且可以通过javascriptObject.internalQmlObject.signalName.connect(receiver.slotName)通过通常的connect机制将javascript对象信号以QML连接到QML插槽。

适于从博客文章的一个例子是下面:

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 
+0

我同意。好的解决方案 – 2013-10-04 06:16:19

0

QML是一种UI声明性语言,广泛用于UI开发。 QML本身不能编写太多或复杂的功能。但是,您可以在单个文件中同时使用JavaScript和QML。如果你想停止一个动画,例如,加载gif动画,在耗费时间的过程之后,只需考虑下面的代码行即可。

loadingAnimation.running = false; 

上述代码行可以从JavaScript文件本身调用。如果您仍然认为此功能不足,请告诉我们您的使用案例。

3

谢谢@RajaVarma。

我为自己找到了解决方案。

qml-file:创建元素Item(my 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文件:为loginItem创建接收器并使用它。

var loginItem; 

function setLoginItem(tempLoginItem) { 
    loginItem = tempLoginItem; 
} 

... 
    // Emit "signal" 
    loginItem.logged(); 
... 
+0

与问题无关,但它被“登录”而不是“登录”;) – 2012-01-03 11:25:48

+4

我很抱歉我的英语。我保证本月会参加语言课程。 – 2012-01-03 17:22:11

1

嗯,从一个真正的JS文件中调用信号非常困难。但有一个更好的选择,恕我直言,自己使用它。创建你自己的班级。

MyClass。qml

import QtQuick 2.0 

QtObject 
{ 
    property var myVariable 
    function myFunction() { console.log("emitting signal"); mySignal() } 
    signal mySignal 
} 

这样就可以轻松实现所需的封装。你甚至可以很好地连接到对象。

然后你可以随心所欲地做任何事情:从它创建一个单例,创建一个全局对象,实例化它。