2013-02-17 5 views
6

私はこのことについて周りを回っています。信号とスロットの周りに頭を包むことはできません。カスケードと信号/スロット

C++のシグナルが発生したときに自動的にUIを更新できるメカニズムを探しています。

例:値を返します_app.method:

私はテキストを持っているQMLで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メソッドのCONNECT QML関数を用いた信号。つまり、今では価値の変化を聴いています。そうすると、その関数が呼び出されます。次に、値を変更します... Q_PROPERTYが書き込み値をsetValueという関数に設定するため、setValueが新しい値で呼び出されます。内部的には、m_iValueが変更され、emitが発生し、valueChangedをリッスンしている誰かに新しい値があることが伝えられます。

こんにちは、私のQMLはそれを聞いています! (_app.valueChanged.connectスクリプトを介して)。それで、QMLオブジェクト(Button)は、それを聞いていましたが、新しい値(valueChanged(m_iValue)を放出したため)が呼び出されたonValueChanged関数があります。 !?!

答えて

10

Q_PROPERTYマクロを使用している場合、ボタンのテキストを明示的に変更する関数でonValueChanged信号をバインドする必要はありません。また、m_iValueでvalueChanged信号を出力する必要もありません。対応するファイルに下記の変更を行う

QML:

Button { 
    horizontalAlignment: HorizontalAlignment.Center 
    verticalAlignment: VerticalAlignment.Center 
    id: aButton 
    text: _app.value 
    onClicked: { 
     _app.value = _app.value + 1 
    } 
} 

HPP:

signals: 
    void valueChanged(); 

CPP:

はのvalueChangedを発します()。

+0

うわー...どういうわけか、シグナル/スロットマジックのおかげでうまくいきます。 この作品を作る特別なキーワードはありますか? –

+0

私が認識していることはありません –

関連する問題