1

質問:Qtで親を指定することは、常に良い考えのようです。ただし、特定の場合になぜそれが必要なのかわかりません。QGraphicsViewを次のように使用する例はたくさんあります。

MainWindow::MainWindow()
{
    QGraphicsView *view = new QGraphicsView(this);
    ...
}

では、なぜこれがQGraphicsView *view = new QGraphicsView(NULL)?この特定の場合よりも優れているのでしょうか?

ありがとう、アレックス

4

3 に答える 3

4

親のないQWidgetは、実際にはトップレベルのウィンドウです。ただし、QWidgetがレイアウトの一部である場合など、親は後で自動的に設定されるため、QWidgetの作成時に親の指定を省略する場合があります。例えば:

QGraphicsView *vew = new QGraphicsView; // the view has no parent

QBoxLayout *layout = new QHBoxLayout;
layout->addWidget(view);

centralWidget()->setLayout(layout); // this automatically reparents the view to 'this'

this新しいQGraphicsViewに渡すか、後で親を変更するかは、実際には重要ではありません。どちらも良いとは思いませんが、見た目が良いのでいつも後者をやっています。

于 2012-09-21T15:56:58.767 に答える
2

「Qtで親を指定することは常に良い考えのようです」

説明があります。

この場合、オブジェクトの破棄を管理する必要がないため、親を指定することをお勧めします。複数のウィンドウを備えたアプリケーションについて考えてみてください。どこでも親として、NULLウィンドウを閉じてもすべてのオブジェクトとそのリソースはまだ生きています。したがって、メモリリークが発生します。一方、適切なオブジェクト階層がある場合は、ウィンドウを閉じると、階層内のすべてのデストラクタが呼び出されます。気にするバグが1つ減りました...

親ウィンドウが子ビューを認識する方法を説明してください。

子が親オブジェクトに自分自身を追加するための内部機能があります。QObjectこれは、コンストラクターとQObjet::setParent(QObject * parent)メソッドの両方で確実に使用されます。署名constから、子オブジェクトが親を変更するため、どこにも存在しないことがわかります。

http://doc.qt.digia.com/4.7-snapshot/qobject.html#details

于 2012-09-21T16:08:10.097 に答える
0

それを理解するのを手伝ってくれたUmNyobeとAnthonyに感謝します。

とにかく、私はカーテンの後ろで何が起こっているのかを理解するためにQTソースを調べなければなりませんでした。

したがって、QObjectsのアイデア全体を次のように理解しています。指定された親で新しいQObjectが作成されると、非表示のQObjectPrivate::setParent_helper(QObject *parent)関数が呼び出されます。それは確かに子を親に登録します:

parent->d_func()->children.append(q); // Strange, they didn't use `this` to register the object :)

つまり、技術的に言えば、親と一緒に子を作成すると、親は子を登録できます。したがって、子を作成するときに親を指定することは便利な習慣です。

場合によっては、親子関係は後で指定されるため(Anthonyの回答を参照)、親が指定されない場合があります。

于 2012-09-21T18:12:06.113 に答える