Qtのメタオブジェクトシステム(メタオブジェクト)の(a)、はじめに

オリジナル:https://blog.csdn.net/liang19890820/article/details/52020693

ブリーフ

Qtのメタオブジェクトシステムは、(メタオブジェクトシステム)信号のスロット機構を提供する、それがオブジェクト、実行時クラス情報、及びシステムの動的特性との間の通信のために使用することができます。

メタオブジェクトシステムは、三つの側面に基づいています。

  • QObjectのクラス:クラスは、基本要素は、ターゲット・システム・オブジェクトのために利用することができる提供します。

  • Q_OBJECTマクロ:動的特性、シグナルとスロット:特徴要素オブジェクトは、例えば、クラス宣言マクロのプライベート部分で有効にすることができます。

  • メタオブジェクトコンパイラ(MOC):各サブクラスQObjectをするためのコードを生成するために必要な特性を達成するための要素オブジェクト。

Q_OBJECTクラス宣言マクロを含むことがわかっている場合MOCツールは、さらに、これらのクラスを含むC ++ソースファイル・オブジェクト・コード要素を生成し、C ++ソースファイルを読み出します。生成されたソースのいずれかの#includeクラスのソースファイル内のファイル、または(より一般的)は、クラスを実装し、直接コンパイルされたコードを接続します。

見つかった一つ以上のマクロがQ_OBJECTクラスを宣言している場合MOCツールは、さらに、これらのクラスを含むC ++ソースファイル・オブジェクト・コード要素を生成し、C ++ソースファイルを読み出します。これらのコンパイラは、ソースファイルまたはソースファイルがクラスに含まれて生成する、または、より一般的に、コンパイルされたクラスにリンクされ実装されます。

|著作権:行く、2または3マイルは、許可ブロガーなく再生してはなりません。

詳細な説明

シグナルとスロット機構は、オブジェクト間の通信を提供する(主として要素オブジェクトシステムの導入)に加えて、他の目的の要素は、次の機能を提供します。

  • QObjectを::メタオブジェクトは、()オブジェクトクラスに関連付けられたメタオブジェクトを返します。

  • QMetaObject ::クラス名は、()C ++コンパイラ提供するサポートのカテゴリ情報(RTTI)ランタイムなしの文字列として、実行時にクラスの名前を返します。

  • QObjectを::継承()クラスのかQObjectの継承ツリーのオブジェクトのインスタンスを返します。

  • QObject :: trは()とQObjectを:: trUtf8は()指定された言語に文字列を変換するために国際的な支援を提供しています。

  • QObject :: setPropertyを()とはQObject ::財産()動的に設定し、名前でプロパティを取得します。

  • QMetaObject ::のnewInstance()構造クラスの新しいインスタンス。

また、使用することもqobject_cast()変換タイプQObjectを動的クラス。qobject_cast()関数とのdynamic_castの標準C ++()関数は、それが利点を有する、類似している:RTTIサポートせず、そして横切ってダイナミックリンクライブラリを変換します。これは、オブジェクトが、ゼロポインタが返される(実行時にチェックされる)正しいタイプである場合、角括弧内のポインタ型への引数を変換しようとし、オブジェクト・タイプに互換性がない場合にはそうでない場合、0を返します。

たとえば、はMyWidgetはQWidgetから継承されたが、また、Q_OBJECTマクロを宣言したとします。

QObject *obj = new MyWidget;

QObjectを* OBJ変数の型は、実際にはMyWidgetオブジェクトを指すので、我々は適切にキャストすることができます:

QWidget *widget = qobject_cast<QWidget *>(obj);

objが、実際にはMyWidgetある、とはMyWidgetはQWidgetのサブクラスであるため、そのため、QObjectをQWidgetの成功から変換。今、あなたがobjのタイプははMyWidget知っていることを、我々ははMyWidget *に変換することができます:

MyWidget *myWidget = qobject_cast<MyWidget *>(obj);

MyWidget qobject_castは()のタイプと構築されたQtのカスタムタイプを区別していないため、変換のタイプが成功しました。

QLabel *label = qobject_cast<QLabel *>(obj);
// label 为 0

しかし、QLabelへの移行とは、0へのポインタを返すことができませんでした。これは、私たちは、オブジェクトの種類に基づいて、実行時に異なる操作を行うことができます:

if (QLabel *label = qobject_cast<QLabel *>(obj)) {
	label->setText(tr("Ping"));
} else if (QPushButton *button = qobject_cast<QPushButton *>(obj)) {
	button->setText(tr("Pong!"));
}
// label 为 0

がマクロはQ_OBJECT(すなわち:任意の要素オブジェクトコードなし)がまだ基本クラスはQObjectケースとして使用されないかもしれないが、画像信号と溝と上記の他の特性は、使用されません。ビュー要素オブジェクトのシステムの観点からではなく、サブクラスQObjectを要素オブジェクトコード当量が最も近い祖先要素オブジェクトコードを有しています。これは、QMetaObject ::クラス名()は、あなたのクラスの本当の名前を返しますが、彼らの先祖の名前を返していないことを意味します。

したがって、強くはQObjectのすべてのサブクラスをプロパティとしてもかかわらずかどうか実際に使用信号とスロットの、Q_OBJECTマクロを使用することをお勧めします。

おすすめ

転載: blog.csdn.net/a844651990/article/details/92979792