4

クラスのメンバー値を更新するためのシグナル/スロット相互作用を設計するためのベストプラクティスは何だと思いますか?

たとえば、UI に表示されるメンバー変数を考えてみましょう。ユーザーが UI で値を変更します。メンバー変数の更新関数を介してメンバー変数を自動的に更新するために、シグナル/スロットの関係が存在します。

また、メンバー変数への変更が UI で自動的に更新されるようにしたいので、シグナル/スロットの関係が逆になります。更新関数を介してメンバー変数を更新すると、シグナルが UI の更新をトリガーします。

これらが循環するのをどのように防ぎますか?メンバー変数の更新関数が呼び出されたときに現在の値に対して新しい値をチェックし、違いがある場合にのみシグナルを送信して UI を更新するのと同じくらい簡単ですか?

または...これを行うよりエレガントな方法はありますか?

4

1 に答える 1

6

これらが循環するのをどのように防ぎますか?メンバー変数の更新関数が呼び出されたときに現在の値に対して新しい値をチェックし、違いがある場合にのみシグナルを送信して UI を更新するのと同じくらい簡単ですか?

はい。

実用的に言えば、これにより、QDial、QSpinBox、QSlider などを接続して同期を維持することができ、無限ループを防ぐために追加の魔法をかける必要はありません。

意味的に言えば、値が変化したときの典型的なシグナルはvalue Changedと呼ばれることに気付きましたか?

void myClass::setValue(int value) {
    if (m_value != value) {
        m_value = value;
        emit valueChanged(value); // YES, THE VALUE *DID* CHANGE!
    }
}

これは、値が変更されていない場合、シグナルが発行されるべきではないことを意味します。これは、直接設定するか、シグナル/スロット呼び出しを介して、値を現在の値に設定しようとすると発生することです。

于 2013-08-15T09:52:18.440 に答える