私はこれについてぐるぐる回っています。シグナルとスロットについて頭を悩ませることはできません。
C++ でシグナルが発生したときに UI を自動的に更新できるメカニズムを探しています。
例:
Qml には、値を返す _app.method というテキストを持つ 2 つのラベルがあります。
onClicked が Q_INVOKABLE メソッドを実行するボタンがあります。そのメソッドは、完了時にシグナルを発行します。たとえば、地理座標をフェッチし、上記のテキストの割り当てが依存する値を更新します。
私が欲しいのは、テキストを更新する何かです。これらの値が変更されたら、割り当てを行います。
これらのシグナル/スロットをわかりやすく説明する必要があります。ドキュメント内の唯一の例は、QML または C++ のみを想定しているようですが、両方が混在しているとは考えていません。サンプル コードには例がありますが、ドキュメントでは具体的に説明されていません。
わかりやすい説明があれば、それに順応できると確信しています。例: 1: これを QML で定義する、2: これを hpp ファイルで定義する、3: これらを cpp ファイルで定義する。
QObject の setPropery("text","value") を使用してみましたが、これを試みるとアプリがクラッシュします。
間違っていたら教えて...
1)QMLで:
Button {
id: aButton
text: _app.value
onClicked: {
_app.valueChanged.connect(aButton.onValueChanged);
_app.value = _app.value + 1;
}
function onValueChanged (val) {
aButton.text = "New value: " + val;
}
}
2) HPP で:
Q_PROPERTY(int value READ value WRITE setValue NOTIFY valueChanged)
public:
int value();
void setValue(int i);
signals:
void valueChanged(int);
private:
int m_iValue;
3) CPP で:
int class::value()
{
return m_iValue;
}
void class::setValue(int i)
{
// name is same as HPP WRITE Q_PROPERTY statement
m_iValue = i;
emit valueChanged(m_iValue);
}
QML では、onClick メソッドが信号を QML 関数に接続します。つまり、値の変更をリッスンしていて、値の変更があった場合、その関数が呼び出されます。次に、値を変更します... Q_PROPERTY が書き込み値を setValue という関数に設定するため、setValue が新しい値で呼び出されます。内部で m_iValue が変更され、エミットが発生します。これにより、valueChanged をリッスンしているすべての人に、新しい値があることが通知されます。
ねえ、私の QML はそれを聞いています! (_app.valueChanged.connect スクリプト経由)。そのため、それをリッスンしていた QML オブジェクト (ボタン) は、新しい値で呼び出された onValueChanged 関数を持っています (エミット valueChanged(m_iValue) のため)。
私がこれを理解したと教えてください??!?!