0

Qt Documentation hereを読んでいました。「Thread Affinity」というタイトルの下に、次の文を見つけました。

注: QObject のメンバー変数は、自動的にその子にはなりません。親子関係は、子のコンストラクターにポインターを渡すか、setParent() を呼び出して設定する必要があります。

オブジェクトとそのメンバー変数の間に設定された親子関係として言及されていることを理解できません。スーパークラスとサブクラスの親子関係しか知らない。

誰かこの文を説明してくれませんか? 例を挙げていただけると助かります。

読んでくれてありがとう。

4

3 に答える 3

1

QObject ( A) は、メンバー変数として他の QObject ( B's) を持つことができます。は親Bとともに自動的に作成されずA、そうである必要はありません。可能ですが、必須ではなく、自動的に行われます。

クラスとそのスーパー クラス (基本クラス) の間に親子関係があるだけでなく、QWidget と埋め込みウィジェットの間にも親子関係があります。たとえば、最終的にウィジェットを正しい順序で破棄するために使用されます。

こちらのドキュメントと、メモリ管理に関する SO の回答をご覧ください

于 2015-09-17T08:36:43.893 に答える
1

AQObjectはオブジェクト コンテナーです。含まれているオブジェクトはその子と呼ばれ、含まれているオブジェクトはそれらの子の親と見なされます。これ自体は、子がどのように割り当てられたかについては何も述べていません。C++11 でいくつかのシナリオを見てみましょう。

void test() {
  QObject aParent;
  // children of automatic storage duration
  QObject aChild1{&aParent}, aChild2;
  aChild2->setParent(&aParent);
  // children of dynamic storage duration
  auto aChild3 = new QObject{&aParent};
  auto aChild4 = new QObject;
  aChild4->setParent(&aParent);
}

struct Parent : QObject {
  QObject aChild5 { this };
  QObject * aChild6 { new QObject };
  QObject notAChild;
  Parent() { aChild6->setParent(this); }
};

このtest()関数は、オブジェクトが自動および動的ストレージ期間のいくつかの子の親になる方法を示しています。親オブジェクトは、コンストラクターで、またはsetParentメソッドの引数として指定できます。

このParentクラスは、メンバー オブジェクトが親クラスの子になることができることを示していますが、必ずしもそうとは限りません。メンバー値は自動保存期間ですが、すべての子オブジェクトがそうであるわけではありません。が指すオブジェクトaChild6は動的ストレージ期間です。QObjectはデストラクタ内のすべての子を削除するため、オブジェクトの有効な保存期間はaChild6自動的に設定されます: オブジェクトを削除しなければならないことを心配する必要はありません。

于 2015-09-17T12:43:39.260 に答える
1

プロパティを明示的に設定しないと、メンバー変数は子オブジェクトになりません。サブクラスは通常、コンストラクターの親として別parentのクラスを取ります。ObjectQObject

class Test : public QObject
{
  Q_OBJECT
  public:
    Test(QObject* prnt) 
      : QObject(prnt),
        timerNoPrnt(), // Test object is NOT the parent. This won't be deleted when Test object gets deleted.
        timer(this)    // Test object is the parent here. This will be deleted when Test object gets deleted. 
    {
      timerNoPrnt->setParent(this); // now parent assigned.
    }
  private:
    QTimer*           timerNoPrnt;   // member variable
    QTimer*           timer;
}
于 2015-09-17T09:24:19.060 に答える