2012-01-02 7 views

答えて

6

アレックスのノアのラジャの解決策は本当に質問に答えません。 AlexはJavaScriptコードからQMLスロットメソッドを直接呼び出し、RajaはJavascriptコードからQMLオブジェクトのプロパティの値を設定します。どちらの方法も信号/スロット機構の主な利点を打ち消している。これは、信号方式の物体がスロットを知る必要がないことである。

信号/スロット機構の精神に近いアプローチがこのblog post(私ではない)に記載されています。これは、javascriptファイル内で、QMLオブジェクトを(Qt.createQmlObject()関数を介して)作成することから成り、その唯一の機能はJavaScriptのオブジェクト信号を含むことである。信号は、内部QMLオブジェクト信号(例えば、internalQmlObject.signalName())を呼び出すことによって、JavaScriptから放出され、javascriptオブジェクト信号は、javascriptObject.internalQmlObject.signalName.connect(receiver.slotName)を介して、通常のconnectメカニズムを用いて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

私は同意します。良い解決策。 –

0

QMLは、UI開発に広く使用されるUI宣言言語です。 QML自体に多すぎる機能や複雑な機能を書き込むことはできません。しかし、JavaScriptとQMLの両方を1つのファイルにまとめることができます。

たとえば、アニメーションを停止するには、時間がかかるプロセスの後に、次のコード行を考慮して、gifアニメーションを読み込むなどします。

loadingAnimation.running = false; 

上記のコード行は、JavaScriptファイル自体から呼び出すことができます。まだこの機能が十分ではないと思われる場合は、ユースケースを教えてください。

3

ありがとう、@ RajaVarma。

自分で解決策を見つけました。

qml-ファイル:スロットの役割を果たす機能を含むcreate要素Item(my loginItem)。例えば (私は時にハンドルログインイベント知っておく必要があります):JSファイル

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 
     ... 
    } 
} 

:loginItemための受信機を作成し、それを使用しています。

var loginItem; 

function setLoginItem(tempLoginItem) { 
    loginItem = tempLoginItem; 
} 

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

質問には関連していませんが、「ログイン」していません; –

+4

私の英語は申し訳ありません。今月の語学コースに行くことを約束します。 –

1

実際のJSファイルから信号を呼び出すのは非常に面白いです。しかし、もっと良い選択肢、IMHOは、代わりにそれを使用しています。独自のクラスを作成します。

MyClass。qml

import QtQuick 2.0 

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

この方法で簡単に必要なカプセル化を達成できます。また、オブジェクトにうまく接続することもできます。

それから、シングルトンを作成し、グローバルオブジェクトを作成し、それをインスタンス化します。

関連する問題