2012-01-02 99 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 
} 

這樣就可以輕鬆實現所需的封裝。你甚至可以很好地連接到對象。

然後你可以隨心所欲地做任何事情:從它創建一個單例,創建一個全局對象,實例化它。