動的に追加されたQWidgetがいくつかあり、それらが変更されたときにいくつかのタスクを実行したいと思います。
変更をトリガーしたQWidgetの名前も必要なので、connect()は使用できないと思います。
どのQWidgetが変更されたかを確認し、共通のハンドラーで値変更イベントをキャッチするにはどうすればよいですか?
3 に答える
これを使用して、イベントがQObjectサブクラスインスタンスに渡される前にイベントをキャッチします:http: //qt-project.org/doc/qt-4.8/qobject.html#installEventFilter
手っ取り早い方法は、通常どおりconnect()を使用してから、slotメソッドでsender()を呼び出して、どのオブジェクトがシグナルを送信したかを確認することです。例えば:
// slot method that you've connected all of your widgets' stateChanged(int) signals to
void MyClass :: someWidgetsStateChanged(int newState)
{
const QObject * s = sender();
if (dynamic_cast<const QCheckBox *>(s) == _myFirstCheckbox) printf("First checkbox is now %s\n", newState?"Checked":"unchecked");
else if (dynamic_cast<const QCheckBox *>(s) == _mySecondCheckbox) printf("Second checkbox is now %s\n", newState?"Checked":"unchecked");
[... and so on...]
}
これが「ダーティ」と見なされる理由は、カプセル化が破られるためです。特に、上記のsomeWidgetsStateChanged()メソッドは、シグナルを生成したオブジェクトに応じて動作が異なるため、たとえば将来のある時点でQPushButton :: clicked()(またはその他)を同じスロットに接続した場合は、次のようになります。 dおそらく、それを適切に処理するためにsomeWidgetsStateChanged()実装を更新する必要があります。それでも、これは機能し、実装するのに多くの労力を必要としません。
いくつかの追加の考えの後、私はなぜこれらのコントローラーを拡張しないのかと言うことに到達しましたか?これにより、parent()またはカスタムコンストラクターを使用して、それらを親オブジェクトにフックできます。
私がそれらをフレンドクラスとして定義することは潜在的に必要です...