QMetaObject Struct
QMetaObjectクラスは、Qtオブジェクトに関するメタ情報を含んでいます。詳細...
Header: | #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 パラメータを持つオーバーロードでは、呼び出しを同期的に行うかどうかを明示的に選択できます:
- type がQt::DirectConnection の場合、メンバは現在のスレッドで即座に呼び出されます。
- type がQt::QueuedConnection の場合、QEvent が送信され、obj が作成された、または移動されたスレッドでアプリケーションがイベント・ループに入るとすぐにメンバが起動されます。
- type がQt::BlockingQueuedConnection の場合、イベントが配信されるまで現在のスレッドがブロッ クされることを除けば、Qt::QueuedConnection と同じ方法でメソッドが呼び出される。この接続タイプを同じスレッドのオブジェクト間の通信に使用すると、デッドロックが発生します。
- type がQt::AutoConnection の場合、obj が呼び出し元と同じスレッドに存在すれば、メンバは同期的に呼び出される。そうでなければ、メンバは非同期的に呼び出される。これは、type パラメータを持たないオーバーロードの動作である。
この関数に渡す必要があるのは、シグネチャ全体ではなく、シグナルまたはスロットの名前だけです。例えば、QThread のquit() スロットを非同期に呼び出すには、以下のコードを使用します:
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 "スロットが、QString 、int
、double
を、指定された順番で正確に取らない場合、呼び出しは失敗する。文字リテラルは正確にマッチする型ではないので、QString の型を明示する必要があったことに注意してください。このメソッドがQStringView 、qsizetype 、float
を取る場合、呼び出しは次のように記述する必要がある:
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)
signal とmethod の引数に互換性がある場合はtrue
を返し、そうでない場合はfalse
を返します。
signal とmethod の両方が正規化されていることが期待されます。
normalizedSignature()も参照してください 。
[static]
bool QMetaObject::checkConnectArgs(const QMetaMethod &signal, const QMetaMethod &method)
これはオーバーロードされた関数である。
signal とmethod の引数に互換性がある場合は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()も参照してください 。
本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。