6

私はこれについてぐるぐる回っています。シグナルとスロットについて頭を悩ませることはできません。

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) のため)。

私がこれを理解したと教えてください??!?!

4

1 に答える 1

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();

于 2013-02-18T06:01:08.477 に答える