javascript-fileからシグナルを出し、qml-fileで受信したい(時間がかかる操作がいつ終了するかを見つけるために)。javascriptからqmlに信号を送信する方法
どうすればいいですか?
javascript-fileからシグナルを出し、qml-fileで受信したい(時間がかかる操作がいつ終了するかを見つけるために)。javascriptからqmlに信号を送信する方法
どうすればいいですか?
アレックスのノアのラジャの解決策は本当に質問に答えません。 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
QMLは、UI開発に広く使用されるUI宣言言語です。 QML自体に多すぎる機能や複雑な機能を書き込むことはできません。しかし、JavaScriptとQMLの両方を1つのファイルにまとめることができます。
たとえば、アニメーションを停止するには、時間がかかるプロセスの後に、次のコード行を考慮して、gifアニメーションを読み込むなどします。
loadingAnimation.running = false;
上記のコード行は、JavaScriptファイル自体から呼び出すことができます。まだこの機能が十分ではないと思われる場合は、ユースケースを教えてください。
ありがとう、@ 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();
...
質問には関連していませんが、「ログイン」していません; –
私の英語は申し訳ありません。今月の語学コースに行くことを約束します。 –
実際のJSファイルから信号を呼び出すのは非常に面白いです。しかし、もっと良い選択肢、IMHOは、代わりにそれを使用しています。独自のクラスを作成します。
MyClass。qml
import QtQuick 2.0
QtObject
{
property var myVariable
function myFunction() { console.log("emitting signal"); mySignal() }
signal mySignal
}
この方法で簡単に必要なカプセル化を達成できます。また、オブジェクトにうまく接続することもできます。
それから、シングルトンを作成し、グローバルオブジェクトを作成し、それをインスタンス化します。
私は同意します。良い解決策。 –