10

アプリケーションで作成されたすべての QWidget のリストを取得するには、単にQApplication::allWidgets().

ドキュメントを読みましたが、すべての QObjects のリストを取得するためのこのようなものは見つかりませんでした。アプリケーションが QWidget ではないスタンドアロンの QObject を作成する場合、そのような機能を使用する必要はありません。

そのようなリストを取得する方法はありますか?

4

1 に答える 1

11

QObjectまず、とQWidgetクラスの違いを理解することが重要です。

クラス QObject

QObject インスタンスには、null ポインターである場合とそうでない場合がある親へのポインターがあります。親なしで QObject インスタンスを作成することは、そのインスタンスの寿命に対する責任があることを理解している限り、非常に正当です。つまり、そうしないdeleteとメモリリークが発生します。

クラス QWidget

親なしで QWidget を作成できるように見えますが、できません。「親なし」で QWidget のインスタンスを作成すると (つまり、null ポインターを指定するか、デフォルトで null ポインターにすることにより)、その親は事実上、アプリケーションの QApplication 1インスタンスに設定されます。

そのようなリストを取得する方法はありますか?

いいえ。理由QApplication::allWidgets()は、すべての QWidget インスタンスが単一の QApplication インスタンスに格納されているそれらへのポインターを持っているためです。QObject ポインターの中央ストアがないため、それらを取得する組み込みの方法はありません。

これを回避する 1 つの方法は、すべてのQObjectsインスタンス (または QObject を継承するクラスのインスタンス) に有効な親があることを確認することです。次に、QObject 関数のchildren()findChild()、およびfindChildren()を使用して、これらのオブジェクトへのポインタを取得できます。

これらは強力なツールであり、他の強力なツールと同様に注意して使用してください。これらを本番コードで使用する前に、C++ オブジェクトの寿命を理解していることを確認してください。



ノート:

  1. QApplicationからQCoreApplication継承しQObjectます。Qt フレームワークによる QApplication の使用方法にはいくつかの制限があります。
于 2011-11-30T16:09:05.153 に答える