サーチ…


備考

QObjectクラスは、すべてのQtオブジェクトの基本クラスです。

QObjectの例

Q_OBJECTマクロは、クラスのプライベートセクションに表示されます。 Q_OBJECTは、クラスがQObjectサブクラスであることをQObjectます。このマクロは、クラスがシグナル/スロットを宣言し、Qtメタオブジェクトシステムを使用するために必要です。

メタオブジェクトコンパイラ(MOC)がQ_OBJECTでクラスを見つけた場合、それを処理し、メタオブジェクトソースコードを含むC ++ソースファイルを生成します。

Q_OBJECTとシグナル/スロットを持つクラスヘッダの例を次に示します。

#include <QObject>

class MyClass : public QObject
{
    Q_OBJECT

public:

public slots:
    void setNumber(double number);        

signals:
    void numberChanged(double number);

private:
} 

qobject_cast

T qobject_cast(QObject *object)

QObjectから派生し、 Q_OBJECTマクロを使用して追加される機能は、 qobject_castを使用するqobject_castです。

例:

class myObject : public QObject
{
    Q_OBJECT
    //...
};

QObject* obj = new myObject();

objmyObject型であるかどうかをチェックし、C ++でそれをキャストするには、一般にdynamic_cast使用できます。これは、コンパイル時にRTTIが有効になっているかどうかに依存します。

他の手のQ_OBJECTマクロは、qobject_castで使用できる変換チェックとコードを生成します。

myObject* my = qobject_cast<myObject*>(obj);
if(!myObject)
{
    //wrong type
}

これはRTTIに依存していません。また、(Qtインタフェース/プラグインを介して)動的ライブラリの境界を越えてキャストすることもできます。

QObjectのライフタイムと所有権

QObjectには、ネイティブのC ++の生の、一意の、または共有のポインタと比較して、独自の代替ライフタイムの概念があります。

QObjectsは、親子関係を宣言することによってobjecttreeを構築する可能性があります。

この関係を宣言する最も簡単な方法は、親オブジェクトをコンストラクタに渡すことです。代替として、 setParentを呼び出すことによってQObjectの親を手動で設定することができます。これがこの関係を宣言する唯一の方向です。親クラスに子を追加することはできませんが、他の方法でのみ子を追加することはできません。

QObject parent;
QObject child* = new QObject(&parent);

parent今すぐスタックでunwindされると、unwind childも削除されます。

QObjectを削除すると、親オブジェクトから自身を「登録解除」します。

QObject parent;
QObject child* = new QObject(&parent);
delete child; //this causes no problem.

同じことがスタック変数にも適用されます。

QObject parent;
QObject child(&parent);

childはスタックの巻き戻し中にparent前に削除され、 parentから登録解除されます。

注意: setParentを手動で呼び出して、宣言の逆順で自動破棄中断できます。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow