サーチ…
備考
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を手動で呼び出して、宣言の逆順で自動破棄を中断できます。