サーチ…
備考
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();
obj
がmyObject
型であるかどうかをチェックし、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
を手動で呼び出して、宣言の逆順で自動破棄を中断できます。