1

私の前のスレッドで、ここの人々は私に、すべてのウィジェットは削除の場合に役立つ親を持っていると言っていました。つまり、親が削除されると、子は自動的に /dev/null にスローされます。

ここで、QWidget *parentがユーザー定義クラスのコンストラクターに渡されていることがわかります 。

 public:
     AddressBook(QWidget *parent = 0);

 private:
     QLineEdit *nameLine;
     QTextEdit *addressText;
 };

これは何を示していますか?

4

2 に答える 2

4

Qt のウィジェットは、特にそれらを組み合わせるときに、階層を定義します。これを(単純化された)例で視覚的に見てみましょう。

私のアプリケーションには、中央の QWidget があります。その上に、他の 2 つのウィジェットがあります。一部の 3D レンダリング用の QGLWidget とコントロール用の QTabWidget。これら 2 つのウィジェットは、私の中心的な QWidget の子です。

QTabWidget には、QWidget 自体であるタブがあります。そして、それらを QTabWidget の子にするのは理にかなっているように思えますよね?

そして、私は続けることができます。おそらく、タブの 1 つにはいくつかのボタンがあり、別のタブにはいくつかのテキストフィールドがあります。

ここで行っているのは、QWidget の階層を作成することです。したがって、この例の場合、次のようになります。

QWidget (the Central Widget)
|
|-QGLWidget (my rendering window)
|-QTabWiget (the tab widget for my controls)
 |
 |-QWidget (the first tab)
 ||
 ||-QPushButton (a button on the first tab)
 |
 |-QWidget (the second tab)
  |
  |-QLineEdit (a widget to provide some input)

とにかく、あなたは私のドリフトをキャッチします。コードに戻ると、QWidget (または任意の派生ウィジェット) のコンストラクターを介してこの階層を定義できます。QGLWidget を作成する場合、そのコンストラクターで、中心となる QWidget を親としてポインターを提供します。

この階層にはいくつかの理由があります。作成/削除について言及しています。しかし、タブを切り替える場合も想像してみてください。タブの上に表示する必要がある要素はどれですか? もちろんその子供たち。また、Qt を使い始めると、レイアウトについて学ぶことができます。レイアウトをウィジェットに設定すると、そのウィジェットのすべての子に影響します。他にもいくつかの理由 (および舞台裏で進行中のこと) がありますが、今のところはこれで十分です。

私の説明はかなり概念的なものです。おそらく、これは技術的に最も詳細で正しい説明ではありませんが、いくつかの指針を与えるはずです。

コード例に戻ります。AddressBook は QWidget から派生します。GUI に配置する場合は、別のウィジェットの上に配置することをお勧めします。その子として。したがって、この AddressBook を追加すると、その親が何であるかを知ることができます。この例では使用されていません。AddressBook 自体が最上位のウィジェットです。しかし、それは同じように簡単に階層の一部になる可能性があります。

かなりの量のテキストですが、概念がある程度説明されていることを願っています。Qt に付属するサンプルの一部をご覧ください。物事がどのように構成されているかを理解する必要があります。接続方法がわからない場合は、上で行ったように図を描いてください。それはあなたにとって意味のあるものになるはずです。誰かが修正や有用な技術的洞察を持っている場合は、遠慮なくコメントするか、私を修正してください。

それが役立つことを願っています。

于 2011-05-10T10:40:57.630 に答える
2

コンストラクターは、ウィジェット間の親子関係を確立します。

メモリ管理と編成 (プレーンな QObject にも有効) とレイアウト (これは必須ではありません。親のレイアウトの外に子ウィジェットを配置できます) に加えて、親子関係は QWidget に興味深いひねりを加えています。

親を持たない QWidget はウィンドウになり、ほとんどのプラットフォームでデスクトップのタスク バーに表示されます。

( Window and Dialog Widgets、Qt 4.7 ドキュメントから取得。)

于 2011-05-10T13:51:23.540 に答える