QMetaObject Struct

QMetaObjectクラスは、Qtオブジェクトに関するメタ情報を含んでいます。詳細...

ヘッダー #include <QMetaObject>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core

パブリックな型

class Connection

パブリック関数

QMetaClassInfo classInfo(int index) const
int classInfoCount() const
int classInfoOffset() const
const char *className() const
QMetaMethod constructor(int index) const
int constructorCount() const
QMetaEnum enumerator(int index) const
int enumeratorCount() const
int enumeratorOffset() const
int indexOfClassInfo(const char *name) const
int indexOfConstructor(const char *constructor) const
int indexOfEnumerator(const char *name) const
int indexOfMethod(const char *method) const
int indexOfProperty(const char *name) const
int indexOfSignal(const char *signal) const
int indexOfSlot(const char *slot) const
bool inherits(const QMetaObject *metaObject) const
(since 6.2) QMetaType metaType() const
QMetaMethod method(int index) const
int methodCount() const
int methodOffset() const
(since 6.5) QObject *newInstance(Args &&... arguments) const
QMetaProperty property(int index) const
int propertyCount() const
int propertyOffset() const
const QMetaObject *superClass() const
QMetaProperty userProperty() const

静的パブリックメンバ

bool checkConnectArgs(const char *signal, const char *method)
bool checkConnectArgs(const QMetaMethod &signal, const QMetaMethod &method)
void connectSlotsByName(QObject *object)
(since 6.7) bool invokeMethod(QObject *context, Functor &&function, Args &&... arguments)
bool invokeMethod(QObject *context, Functor &&function, FunctorReturnType *ret)
(since 6.5) bool invokeMethod(QObject *obj, const char *member, Args &&... args)
(since 6.7) bool invokeMethod(QObject *context, Functor &&function, QTemplatedMetaMethodReturnArgument<FunctorReturnType> ret, Args &&... arguments)
(since 6.7) bool invokeMethod(QObject *context, Functor &&function, Qt::ConnectionType type, Args &&... arguments)
bool invokeMethod(QObject *context, Functor &&function, Qt::ConnectionType type = Qt::AutoConnection, FunctorReturnType *ret = nullptr)
(since 6.5) bool invokeMethod(QObject *obj, const char *member, QTemplatedMetaMethodReturnArgument<ReturnArg> ret, Args &&... args)
(since 6.5) bool invokeMethod(QObject *obj, const char *member, Qt::ConnectionType type, Args &&... args)
(since 6.7) bool invokeMethod(QObject *context, Functor &&function, Qt::ConnectionType type, QTemplatedMetaMethodReturnArgument<FunctorReturnType> ret, Args &&... arguments)
(since 6.5) bool invokeMethod(QObject *obj, const char *member, Qt::ConnectionType type, QTemplatedMetaMethodReturnArgument<ReturnArg> ret, Args &&... args)
QByteArray normalizedSignature(const char *method)
QByteArray normalizedType(const char *type)

マクロ

QMetaMethodArgument Q_ARG(Type, const Type &value)
QMetaMethodReturnArgument Q_RETURN_ARG(Type, Type &value)

詳しい説明

Qt の Qtメタオブジェクトシステムは、シグナルとスロットのオブジェクト間通信メカニズム、ランタイム型情報、Qt プロパティシステムを担当します。アプリケーションで使用される各QObject サブクラスに対して、1 つの QMetaObject インスタンスが作成され、このインスタンスにQObject サブクラスのすべてのメタ情報が格納されます。このオブジェクトは、QObject::metaObject ()として利用できます。

このクラスは通常、アプリケーション・プログラミングには必要ありませんが、スクリプト・エンジンやGUIビルダーのようなメタ・アプリケーションを書く場合には便利です。

役に立つと思われる関数は以下の通りです:

  • className() はクラスの名前を返します。
  • superClass() はスーパークラスのメタオブジェクトを返します。
  • method() とmethodCount() は、クラスのメタメソッド(シグナル、スロット、その他のinvokable メンバ関数)に関する情報を提供します。
  • enumerator() およびenumeratorCount() は、クラスの列挙子に関する情報を提供します。
  • propertyCount() およびproperty() は、クラスのプロパティに関する情報を提供します。
  • constructor() およびconstructorCount() は、クラスのメタ・コンストラクタに関する情報を提供します。

インデックス関数indexOfConstructor()、indexOfMethod()、indexOfEnumerator()、indexOfProperty() は、コンストラクタ、メンバ関数、列挙子、プロパティの名前をメタオブジェクトのインデックスにマッピングします。例えば、シグナルをスロットに接続する場合、Qtは内部的にindexOfMethod ()を使用します。

クラスは、QMetaClassInfo オブジェクトに格納された、追加クラス情報の名前と 値のペアのリストを持つこともできます。ペアの数はclassInfoCount() で返され、単一のペアはclassInfo() で返され、indexOfClassInfo() でペアを検索できます。

注: QMetaObjectは通常、コンパイル時に生成される静的な読み取り専用インスタンスであるため、メタ・オブジェクト・システムを使用する操作は一般的にスレッドセーフです。しかし、メタ・オブジェクトがアプリケーションによって動的に変更される場合(例えば、QQmlPropertyMap )、アプリケーションはそれぞれのメタ・オブジェクトへのアクセスを明示的に同期する必要があります。

QMetaClassInfo,QMetaEnum,QMetaMethod,QMetaProperty,QMetaType,メタ・オブジェクト・システムも参照のこと

メンバー関数ドキュメント

[static, since 6.5] template <typename... Args> bool QMetaObject::invokeMethod(QObject *obj, const char *member, Args &&... args)

[static, since 6.5] template <typename ReturnArg, typename... Args> bool QMetaObject::invokeMethod(QObject *obj, const char *member, QTemplatedMetaMethodReturnArgument<ReturnArg> ret, Args &&... args)

[static, since 6.5] template <typename... Args> bool QMetaObject::invokeMethod(QObject *obj, const char *member, Qt::ConnectionType type, Args &&... args)

[static, since 6.5] template <typename ReturnArg, typename... Args> bool QMetaObject::invokeMethod(QObject *obj, const char *member, Qt::ConnectionType type, QTemplatedMetaMethodReturnArgument<ReturnArg> ret, Args &&... args)

obj オブジェクトのmember (シグナルまたはスロット名)を呼び出す。そのメンバを呼び出すことができた場合はtrue を返します。そのようなメンバがない場合、またはパラメータが一致しない場合はfalse を返します。

QTemplatedMetaMethodReturnArgument パラメータを持つオーバーロードの場合、member 関数呼び出しの返り値がret に置かれます。このようなメンバを持たないオーバーロードの場合、呼び出された関数の戻り値は(もしあれば)破棄されます。QTemplatedMetaMethodReturnArgument は、直接使用してはならない内部型です。代わりに、qReturnArg()関数を使用してください。

Qt::ConnectionType type パラメータを持つオーバーロードでは、呼び出しを同期的に行うかどうかを明示的に選択できます:

  • typeQt::DirectConnection の場合、メンバは現在のスレッドで即座に呼び出されます。
  • typeQt::QueuedConnection の場合、QEvent が送信され、obj が作成された、または移動されたスレッドでアプリケーションがイベント・ループに入るとすぐにメンバが起動されます。
  • typeQt::BlockingQueuedConnection の場合、イベントが配信されるまで現在のスレッドがブロッ クされることを除けば、Qt::QueuedConnection と同じ方法でメソッドが呼び出される。この接続タイプを同じスレッドのオブジェクト間の通信に使用すると、デッドロックが発生します。
  • typeQt::AutoConnection の場合、obj が呼び出し元と同じスレッドに存在すれば、メンバは同期的に呼び出される。そうでなければ、メンバは非同期的に呼び出される。これは、type パラメータを持たないオーバーロードの動作である。

この関数に渡す必要があるのは、シグネチャ全体ではなく、シグナルまたはスロットの名前だけです。例えば、QThreadquit() スロットを非同期に呼び出すには、以下のコードを使用します:

QMetaObject::invokeMethod(thread, "quit",
                          Qt::QueuedConnection);

非同期メソッド呼び出しでは、パラメータはコピー可能な型でなければなりません。これは、Qtが裏で引数をコピーしてイベントに格納する必要があるからです。Qt 6.5以降、この関数は使用される型を自動的に登録します。しかし、副作用として、前方宣言された型のみを使用して呼び出しを行うことはできません。さらに、const修飾されていない型への参照をパラメータとして使用する非同期呼び出しもできません。

任意のオブジェクトに対してcompute(QString, int, double) スロットを同期的に呼び出すには、obj その戻り値を取得する:

QString retVal;
QMetaObject::invokeMethod(obj, "compute", Qt::DirectConnection,
                         qReturnArg(retVal),
                         QString("sqrt"), 42, 9.7);

もし "compute "スロットが、QStringintdouble を、指定された順番で正確に取らない場合、呼び出しは失敗する。文字リテラルは正確にマッチする型ではないので、QString の型を明示する必要があったことに注意してください。このメソッドがQStringViewqsizetypefloat を取る場合、呼び出しは次のように記述する必要がある:

QString retVal;
QMetaObject::invokeMethod(obj, "compute", Qt::DirectConnection,
                         qReturnArg(retVal),
                         QStringView("sqrt"), qsizetype(42), 9.7f);

同じ呼び出しは、Q_ARG() とQ_RETURN_ARG() マクロを使用して実行できる:

QString retVal;
QMetaObject::invokeMethod(obj, "compute", Qt::DirectConnection,
                          Q_RETURN_ARG(QString, retVal),
                          Q_ARG(QString, "sqrt"),
                          Q_ARG(int, 42),
                          Q_ARG(double, 9.7));

マクロは、Qt 6.4以前のバージョンとの互換性のために保持されており、マクロを使用しないパラメータと自由に混在させることができます。マクロはQt 6.4以前のバージョンとの互換性のために残されており、マクロを使用しないパラメータと自由に混在させることができます。

注意:この関数はスレッドセーフです。

この関数は Qt 6.5 で導入されました。

Q_ARG(),Q_RETURN_ARG(),QMetaMethod::invoke()も参照してください

[static] template <typename Functor, typename FunctorReturnType> bool QMetaObject::invokeMethod(QObject *context, Functor &&function, FunctorReturnType *ret)

[static] template <typename Functor, typename FunctorReturnType> bool QMetaObject::invokeMethod(QObject *context, Functor &&function, Qt::ConnectionType type = Qt::AutoConnection, FunctorReturnType *ret = nullptr)

context のイベントループでfunction を呼び出す。function はファンクタまたはメンバ関数へのポインタ。関数を呼び出すことができた場合はtrue を返します。そのような関数がないか、パラメータが一致しなかった場合はfalse を返します。関数呼び出しの戻り値はret に格納される。

type が設定されている場合、その接続タイプを使用して関数が呼び出されます。そうでない場合は、Qt::AutoConnection が使用される。

注意:この関数はスレッドセーフです。

[static, since 6.7] template <typename Functor, typename... Args> bool QMetaObject::invokeMethod(QObject *context, Functor &&function, Args &&... arguments)

[static, since 6.7] template <typename Functor, typename FunctorReturnType, typename... Args> bool QMetaObject::invokeMethod(QObject *context, Functor &&function, QTemplatedMetaMethodReturnArgument<FunctorReturnType> ret, Args &&... arguments)

[static, since 6.7] template <typename Functor, typename... Args> bool QMetaObject::invokeMethod(QObject *context, Functor &&function, Qt::ConnectionType type, Args &&... arguments)

[static, since 6.7] template <typename Functor, typename FunctorReturnType, typename... Args> bool QMetaObject::invokeMethod(QObject *context, Functor &&function, Qt::ConnectionType type, QTemplatedMetaMethodReturnArgument<FunctorReturnType> ret, Args &&... arguments)

context のイベントループ内でarguments を使ってfunction を呼び出す。function はファンクタまたはメンバ関数へのポインタ。関数を呼び出すことができれば、true を返します。関数呼び出しの戻り値はret に置かれます。引数ret に使用されるオブジェクトは、qReturnArg()にオブジェクトを渡して取得する。例えば

MyClass *obj = ...;
int result = 0;
QMetaObject::invokeMethod(obj, &MyClass::myMethod, qReturnArg(result), parameter);

type が設定されている場合、その接続タイプを使用して関数が呼び出されます。そうでない場合は、Qt::AutoConnection が使用されます。

注意:この関数はスレッドセーフです。

この関数は Qt 6.7 で導入されました。

[static] bool QMetaObject::checkConnectArgs(const char *signal, const char *method)

引数signalmethod に互換性がある場合はtrue を返し、そうでない場合はfalse を返す。

signalmethod の両方が正規化されていることが期待される。

normalizedSignature()も参照のこと

[static] bool QMetaObject::checkConnectArgs(const QMetaMethod &signal, const QMetaMethod &method)

これはオーバーロードされた関数である。

signalmethod の引数に互換性がある場合はtrue を返し、そうでない場合はfalse を返す。

QMetaClassInfo QMetaObject::classInfo(int index) const

与えられたindex を持つクラス情報の項目のメタデータを返します。

例:

class MyClass : public QObject
{
    Q_OBJECT
    Q_CLASSINFO("author", "Sabrina Schweinsteiger")
    Q_CLASSINFO("url", "http://doc.moosesoft.co.uk/1.0/")

public:
    ...
};

classInfoCount(),classInfoOffset(),indexOfClassInfo()も参照

int QMetaObject::classInfoCount() const

このクラスのクラス情報の項目数を返します。

classInfo()、classInfoOffset() およびindexOfClassInfo()も参照

int QMetaObject::classInfoOffset() const

すなわち、このクラスの最初のクラス情報項目のインデックス位置を返します。

クラスにクラス情報を持つスーパークラスがない場合、オフセットは 0 になります。そうでない場合、オフセットは、クラスのスーパークラスのすべてのクラス情報項目の合計になります。

classInfo()、classInfoCount() およびindexOfClassInfo()も参照してください

const char *QMetaObject::className() const

クラス名を返します。

superClass()も参照ください

[static] void QMetaObject::connectSlotsByName(QObject *object)

与えられたobject のすべての子オブジェクトを再帰的に検索し、それらの子オブジェクトからのマッチするシグナルを、以下の形式に従うobject のスロットに接続する:

void on_<object name>_<signal name>(<signal parameters>);

我々のオブジェクトにobject name button1 を持つQPushButton タイプの子オブジェクトがあるとしよう。ボタンのclicked() シグナルをキャッチするスロットは次のようになります:

void on_button1_clicked();

object 自身が適切に設定されたオブジェクト名を持っている場合、それ自身のシグナルもそれぞれのスロットに接続されます。

QObject::setObjectName()も参照してください

QMetaMethod QMetaObject::constructor(int index) const

与えられたindex を持つコンストラクタのメタデータを返します。

constructorCount() およびnewInstance()も参照

int QMetaObject::constructorCount() const

このクラスのコンストラクタの数を返します。

constructor() およびindexOfConstructor()も参照 ください。

QMetaEnum QMetaObject::enumerator(int index) const

与えられたindex を持つ列挙体のメタデータを返す。

enumeratorCount(),enumeratorOffset(),indexOfEnumerator()も参照

int QMetaObject::enumeratorCount() const

このクラスの列挙子の数を返します。

enumerator()、enumeratorOffset() およびindexOfEnumerator()も参照

int QMetaObject::enumeratorOffset() const

このクラスの列挙子オフセット、つまりこのクラスの最初の列挙子のインデックス位置を返します。

このクラスに列挙子を持つスーパークラスがない場合、オフセットは 0 になります。そうでない場合、オフセットはこのクラスのスーパークラスのすべての列挙子の合計になります。

enumerator()、enumeratorCount() およびindexOfEnumerator()も参照

int QMetaObject::indexOfClassInfo(const char *name) const

クラス情報項目name を見つけ、そのインデックスを返します。

classInfo()、classInfoCount() およびclassInfoOffset()も参照してください

int QMetaObject::indexOfConstructor(const char *constructor) const

constructor を見つけ、そのインデックスを返す。

normalizedSignature() が返すように、constructor は正規化された形式でなければならないことに注意。

constructor()、constructorCount()、normalizedSignature()も参照

int QMetaObject::indexOfEnumerator(const char *name) const

列挙子name を見つけ、そのインデックスを返す。

enumerator(),enumeratorCount(),enumeratorOffset()も参照

int QMetaObject::indexOfMethod(const char *method) const

method を見つけ、そのインデックスを返す。

normalizedSignature() が返すように、method は正規化された形式でなければならないことに注意。

method()、methodCount()、methodOffset()、normalizedSignature()も参照

int QMetaObject::indexOfProperty(const char *name) const

プロパティname を見つけ、そのインデックスを返す。

property()、propertyCount() およびpropertyOffset()も参照してください

int QMetaObject::indexOfSignal(const char *signal) const

signal を見つけ、そのインデックスを返す。

これはindexOfMethod() と同じだが、メソッドが存在するがシグナルでない場合は -1 を返す。

normalizedSignature() が返すように、signal は正規化された形式でなければならないことに注意。

indexOfMethod()、normalizedSignature()、method()、methodCount()、methodOffset()も参照の こと。

int QMetaObject::indexOfSlot(const char *slot) const

slot を検索し、そのインデックスを返す。

これはindexOfMethod() と同じだが、メソッドが存在するがスロットでない場合は -1 を返す。

indexOfMethod()、method()、methodCount()、methodOffset()も参照

[noexcept] bool QMetaObject::inherits(const QMetaObject *metaObject) const

このQMetaObject で記述されているクラスがmetaObject で記述されている型を継承している場合はtrue を返し、そうでない場合は false を返します。

型はそれ自身を継承するとみなされます。

[since 6.2] QMetaType QMetaObject::metaType() const

このメタオブジェクトに対応するメタタイプを返します。メタオブジェクトが名前空間に由来する場合は、無効なメタタイプが返されます。

この関数は Qt 6.2 で導入されました。

QMetaMethod QMetaObject::method(int index) const

与えられたindex を持つメソッドのメタデータを返します。

methodCount(),methodOffset(),indexOfMethod()も参照

int QMetaObject::methodCount() const

このクラスのメソッド数(各基底クラスが提供するメソッド数を含む)を返します。これには、通常のメンバ関数だけでなく、シグナルやスロットも含まれます。

指定したクラスに固有のメソッドを含むQStringList を取得するには、以下のようなコードを使用します:

const QMetaObject* metaObject = obj->metaObject();
QStringList methods;
for(int i = metaObject->methodOffset(); i < metaObject->methodCount(); ++i)
    methods << QString::fromLatin1(metaObject->method(i).methodSignature());

method()、methodOffset()、indexOfMethod()も参照のこと

int QMetaObject::methodOffset() const

このクラスのメソッドのオフセット、つまりこのクラスの最初のメンバ関数のインデックスの位置を返します。

オフセットは、このクラスのスーパークラスのすべてのメソッドの合計です (QObject は deleteLater() スロットと destroyed() シグナルを持っているので、これは常に正です)。

method()、methodCount()、indexOfMethod()も参照

[since 6.5] template <typename... Args> QObject *QMetaObject::newInstance(Args &&... arguments) const

このクラスの新しいインスタンスを構築し、新しいオブジェクトを返す。適切なコンストラクタがない場合はnullptr を返す。引数arguments の型は、一致するコンストラクタを見つけるために使用され、シグナルスロット接続と同じようにそのコンストラクタに転送されます。

Q_INVOKABLE 修飾子で宣言されたコンストラクタだけが、メタオブジェクトシステムを通して利用可能になることに注意してください。

この関数はQt 6.5で導入されました。

constructor()も参照してください

[static] QByteArray QMetaObject::normalizedSignature(const char *method)

与えられたmethod のシグネチャを正規化します。

Qtは正規化されたシグネチャを使用して、与えられた2つのシグナルとスロットに互換性があるかどうかを判断します。正規化によって、空白文字は最小限になり、'const'は必要に応じて先頭に移動され、値型から'const'は削除され、const参照は値に置き換えられます。

checkConnectArgs() およびnormalizedType()も参照してください

[static] QByteArray QMetaObject::normalizedType(const char *type)

type を正規化します。

Qt がどのように正規化するかについてはQMetaObject::normalizedSignature() を参照してください。

例を参照してください:

QByteArray normType = QMetaObject::normalizedType(" int    const  *");
// normType is now "const int*"

normalizedSignature()も参照してください

QMetaProperty QMetaObject::property(int index) const

与えられたindex を持つプロパティのメタデータを返す。そのようなプロパティが存在しない場合は、NULLQMetaProperty が返されます。

propertyCount()、propertyOffset() およびindexOfProperty()も参照してください

int QMetaObject::propertyCount() const

各基底クラスが提供するプロパティの数を含め、このクラスのプロパティの数を返します。

指定したクラスに固有のプロパティを含むQStringList を取得するには、以下のようなコードを使用します:

const QMetaObject* metaObject = obj->metaObject();
QStringList properties;
for(int i = metaObject->propertyOffset(); i < metaObject->propertyCount(); ++i)
    properties << QString::fromLatin1(metaObject->property(i).name());

property()、propertyOffset()、およびindexOfProperty()も参照してください

int QMetaObject::propertyOffset() const

このクラスのプロパティのオフセット、つまりこのクラスの最初のプロパティのインデックス位置を返します。

オフセットは、クラスのスーパークラスのすべてのプロパティの合計です (QObject には name() プロパティがあるため、常に正の値になります)。

property()、propertyCount()、indexOfProperty()も参照してください

const QMetaObject *QMetaObject::superClass() const

スーパークラスのメタオブジェクトを返します。そのようなオブジェクトがない場合はnullptr を返します。

className()も参照してください

QMetaProperty QMetaObject::userProperty() const

USER フラグが true に設定されているプロパティを返します。

QMetaProperty::isUser()も参照

マクロ・ドキュメント

QMetaMethodArgument Q_ARG(Type, const Type &value)

このマクロは、Type とその型のvalue を受け取り、QMetaMethodArgument を返す。この QMetaMethodArgument は、Args &&... の引数とともに、QMetaObject::invokeMethod() テンプレートに渡すことができる。

Q_RETURN_ARG()も参照してください

QMetaMethodReturnArgument Q_RETURN_ARG(Type, Type &value)

このマクロは、Type と、その型のvalue への nononst 参照を取り、QMetaMethodReturnArgument を返す。この QMetaMethodReturnArgument は、Args &&... の引数とともに、QMetaObject::invokeMethod() テンプレートに渡すことができる。

Q_ARG()も参照してください

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.