javascript-fileからシグナルを送信し、qml-fileで受信したい(時間のかかる操作がいつ終了するかを見つけるため)。
どうすればいいですか?
javascript-fileからシグナルを送信し、qml-fileで受信したい(時間のかかる操作がいつ終了するかを見つけるため)。
どうすればいいですか?
AlexのnoreRajaのソリューションも実際には質問に答えません。AlexはJavaScriptコードから直接QMLスロットメソッドを呼び出すことで構成され、RajaはJavascriptコードからQMLオブジェクトのプロパティの値を設定することで構成されます。どちらのアプローチも、シグナリングオブジェクトがスロットを知る必要がないというシグナル/スロットメカニズムの主な利点を打ち消します。
信号/スロットメカニズムの精神に近いアプローチは、このブログ投稿で説明されています(私のものではありません)。これは、javascriptファイル内で、(Qt.createQmlObject()
関数を介して)QMLオブジェクトを作成することで構成され、その唯一の関数はjavascriptのオブジェクト信号を含むことです。シグナルは、内部QMLオブジェクトシグナル(例)を呼び出すことでjavascriptから発行され、javascriptオブジェクトシグナルは、を介して通常のメカニズムinternalQmlObject.signalName()
でQMLスロットにQMLで接続できます。connect
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);
}
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
ありがとう、@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-fileの場合: 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
}
このようにして、必要なカプセル化を簡単に実現できます。また、オブジェクトにうまく接続することもできます。
次に、それを使って好きなことを行うことができます。それからシングルトンを作成し、グローバルオブジェクトを作成し、インスタンス化します。