QMetaMethod Class
QMetaMethod クラスは、メンバ関数に関するメタデータを提供します。詳細...
| ヘッダー: | #include <QMetaMethod> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
QMetaMethodの比較
| カテゴリ | 比較可能な型 |
|---|---|
| equality | QMetaMethod |
パブリック型
| enum | Access { Private, Protected, Public } |
| enum | MethodType { Method, Signal, Slot, Constructor } |
パブリック関数
| QMetaMethod::Access | access() const |
(since 6.5) bool | invoke(QObject *obj, Args &&... arguments) const |
(since 6.5) bool | invoke(QObject *obj, QTemplatedMetaMethodReturnArgument<ReturnArg> ret, Args &&... arguments) const |
(since 6.5) bool | invoke(QObject *obj, Qt::ConnectionType type, Args &&... arguments) const |
(since 6.5) bool | invoke(QObject *obj, Qt::ConnectionType type, QTemplatedMetaMethodReturnArgument<ReturnArg> ret, Args &&... arguments) const |
(since 6.5) bool | invokeOnGadget(void *gadget, Args &&... arguments) const |
(since 6.5) bool | invokeOnGadget(void *gadget, QTemplatedMetaMethodReturnArgument<ReturnArg> ret, Args &&... arguments) const |
(since 6.2) bool | isConst() const |
| bool | isValid() const |
| int | methodIndex() const |
| QByteArray | methodSignature() const |
| QMetaMethod::MethodType | methodType() const |
| QByteArray | name() const |
(since 6.9) QByteArrayView | nameView() const |
| int | parameterCount() const |
(since 6.0) QMetaType | parameterMetaType(int index) const |
| QList<QByteArray> | parameterNames() const |
| int | parameterType(int index) const |
(since 6.0) QByteArray | parameterTypeName(int index) const |
| QList<QByteArray> | parameterTypes() const |
(since 6.0) int | relativeMethodIndex() const |
(since 6.0) QMetaType | returnMetaType() const |
| int | returnType() const |
| int | revision() const |
| const char * | tag() const |
| const char * | typeName() const |
静的パブリックメンバー
| QMetaMethod | fromSignal(PointerToMemberFunction signal) |
関連する非メンバー
| bool | operator!=(const QMetaMethod &lhs, const QMetaMethod &rhs) |
| bool | operator==(const QMetaMethod &lhs, const QMetaMethod &rhs) |
マクロ
(until 6.13) | Q_METAMETHOD_INVOKE_MAX_ARGS |
詳細な説明
QMetaMethod には、methodType()、methodSignature()、parameterTypes() およびparameterNames() のリスト、戻り値のtypeName()、tag()、およびaccess() 指定子があります。invoke() を使用すると、任意のQObject に対してメソッドを呼び出すことができます。
QMetaObject 、QMetaEnum 、QMetaProperty 、およびQtのプロパティシステムも参照してください 。
メンバ型のドキュメント
enum QMetaMethod::Access
この列挙型は、C++ で用いられる規約に従い、メソッドのアクセスレベルを表します。
| 定数 | 値 |
|---|---|
QMetaMethod::Private | 0 |
QMetaMethod::Protected | 1 |
QMetaMethod::Public | 2 |
enum QMetaMethod::MethodType
| 定数 | 値 | 説明 |
|---|---|---|
QMetaMethod::Method | QMETHOD_CODE | この関数はプレーンなメンバ関数です。 |
QMetaMethod::Signal | 1 | この関数はシグナルです。 |
QMetaMethod::Slot | 2 | この関数はスロットです。 |
QMetaMethod::Constructor | 3 | この関数はコンストラクタです。 |
メンバ関数のドキュメント
QMetaMethod::Access QMetaMethod::access() const
このメソッドのアクセス指定(private、protected、または public)を返します。
注:シグナルは 常に public ですが、これは実装上の詳細として扱うべきです。クラス外部からシグナルを発行することは、ほとんどの場合、避けるべきです。
関連項目: methodType()。
[static] template <typename PointerToMemberFunction> QMetaMethod QMetaMethod::fromSignal(PointerToMemberFunction signal)
指定されたsignal に対応するメタメソッドを返します。signal がnullptr であるか、そのクラスのシグナルでない場合は、無効なQMetaMethod を返します。
例:
QMetaMethod destroyedSignal = QMetaMethod::fromSignal(&QObject::destroyed);[since 6.5] template <typename... Args> bool QMetaMethod::invoke(QObject *obj, Args &&... arguments) const
[since 6.5] template <typename ReturnArg, typename... Args> bool QMetaMethod::invoke(QObject *obj, QTemplatedMetaMethodReturnArgument<ReturnArg> ret, Args &&... arguments) const
[since 6.5] template <typename... Args> bool QMetaMethod::invoke(QObject *obj, Qt::ConnectionType type, Args &&... arguments) const
[since 6.5] template <typename ReturnArg, typename... Args> bool QMetaMethod::invoke(QObject *obj, Qt::ConnectionType type, QTemplatedMetaMethodReturnArgument<ReturnArg> ret, Args &&... arguments) const
オブジェクト `object` に対してこのメソッドを呼び出します。メンバーの呼び出しが可能だった場合は `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 パラメータを持たないオーバーロードの挙動です。
QPushButton に対してanimateClick() スロットを非同期で呼び出すには:
int methodIndex = pushButton->metaObject()->indexOfMethod("animateClick()");
QMetaMethod method = metaObject->method(methodIndex);
method.invoke(pushButton, Qt::QueuedConnection);非同期メソッド呼び出しでは、パラメータはコピー可能な型でなければなりません。これは、Qtが引数をコピーして、内部でイベントに格納する必要があるためです。 Qt 6.5 以降、この関数は使用されている型を自動的に登録しますが、副作用として、前方宣言のみされている型を使用して呼び出しを行うことはできません。また、const 修飾子が付いていない型の参照をパラメータとして使用する非同期呼び出しも行うことはできません。
任意のオブジェクトのcompute(QString, int, double) スロットを同期的に呼び出しobj 、その戻り値を取得するには:
QString retVal;
QByteArray normalizedSignature = QMetaObject::normalizedSignature("compute(QString, int, double)");
int methodIndex = obj->metaObject()->indexOfMethod(normalizedSignature);
QMetaMethod method = obj->metaObject()->method(methodIndex);
method.invoke(obj, Qt::DirectConnection, qReturnArg(retVal),
QString("sqrt"), 42, 9.7);「compute」スロットが、指定された順序でQString を1つ、int を1つ、double を1つ正確に受け取らない場合、呼び出しは失敗します。 文字リテラルは厳密に一致する型ではないため、QString の型を明示的に指定する必要があった点に注意してください。もしこのメソッドが代わりにQByteArray 、qint64 、long double を受け取る場合、呼び出しは次のように記述する必要があります:
QString retVal;
QByteArray normalizedSignature = QMetaObject::normalizedSignature("compute(QByteArray, qint64, long double)");
int methodIndex = obj->metaObject()->indexOfMethod(normalizedSignature);
QMetaMethod method = obj->metaObject()->method(methodIndex);
method.invoke(obj, Qt::DirectConnection, qReturnArg(retVal),
QByteArray("sqrt"), qint64(42), 9.7L);同じ呼び出しは、Q_ARG() およびQ_RETURN_ARG() マクロを使用して、次のように実行できます:
QString retVal;
QByteArray normalizedSignature = QMetaObject::normalizedSignature("compute(QString, int, double)");
int methodIndex = obj->metaObject()->indexOfMethod(normalizedSignature);
QMetaMethod method = obj->metaObject()->method(methodIndex);
method.invoke(obj,
Qt::DirectConnection,
Q_RETURN_ARG(QString, retVal),
Q_ARG(QString, "sqrt"),
Q_ARG(int, 42),
Q_ARG(double, 9.7));警告: この方法では 引数の有効性はチェックされません。object は、このQMetaMethod が構築されたQMetaObject のクラスのインスタンスでなければなりません。
これらの関数は Qt 6.5 で導入されました。
Q_ARG()、Q_RETURN_ARG()、qRegisterMetaType()、およびQMetaObject::invokeMethod()も参照してください 。
[since 6.5] template <typename... Args> bool QMetaMethod::invokeOnGadget(void *gadget, Args &&... arguments) const
[since 6.5] template <typename ReturnArg, typename... Args> bool QMetaMethod::invokeOnGadget(void *gadget, QTemplatedMetaMethodReturnArgument<ReturnArg> ret, Args &&... arguments) const
Q_GADGET に対してこのメソッドを呼び出します。メンバを呼び出すことができた場合は `true ` を返します。そのようなメンバが存在しない場合、またはパラメータが一致しなかった場合は `false ` を返します。
ポインタ `gadget ` は、ガジェットクラスのインスタンスを指している必要があります。
呼び出しは常に同期的です。
QTemplatedMetaMethodReturnArgument パラメータを持つオーバーロードの場合、member 関数呼び出しの戻り値はret に格納されます。それがないオーバーロードの場合、呼び出された関数の戻り値(ある場合)は破棄されます。 QTemplatedMetaMethodReturnArgument は内部型であり、直接使用してはいけません。代わりに、qReturnArg() 関数を使用してください。
警告:このメソッドは 引数の有効性を検証しません。gadget は、このQMetaMethod が構築された際のQMetaObject のクラスのインスタンスでなければなりません。
これらの関数は Qt 6.5 で導入されました。
Q_ARG()、Q_RETURN_ARG()、qRegisterMetaType()、およびQMetaObject::invokeMethod()も参照してください 。
[since 6.2] bool QMetaMethod::isConst() const
そのメソッドがconst修飾されているかどうかを返します。
注:このメソッドは 、const メソッドが古いバージョンの Qt に対してコンパイルされたライブラリに属している場合、誤って `false ` を返す可能性があります。
この関数は Qt 6.2 で導入されました。
bool QMetaMethod::isValid() const
このメソッドが有効(イントロスペクションおよび呼び出しが可能)な場合は `true ` を返し、そうでない場合は `false` を返します。
int QMetaMethod::methodIndex() const
このメソッドのインデックスを返します。
QByteArray QMetaMethod::methodSignature() const
このメソッドのシグネチャを返します(例:setValue(double) )。
parameterTypes() およびparameterNames()も参照してください 。
QMetaMethod::MethodType QMetaMethod::methodType() const
このメソッドの型(シグナル、スロット、またはメソッド)を返します。
access()も参照してください 。
QByteArray QMetaMethod::name() const
このメソッドの名前を返します。
methodSignature() およびparameterCount()も参照してください 。
[since 6.9] QByteArrayView QMetaMethod::nameView() const
このメソッドの名前を返します。返されるQByteArrayView は、そのメソッドが属するクラスのメタオブジェクトが有効である限り、有効です。
この関数は Qt 6.9 で導入されました。
nameも参照してください 。
int QMetaMethod::parameterCount() const
このメソッドのパラメータ数を返します。
parameterType() およびparameterNames()も参照してください 。
[since 6.0] QMetaType QMetaMethod::parameterMetaType(int index) const
指定されたindex にあるパラメータのメタタイプを返します。
index が0未満、またはparameterCount()より大きい場合、無効なQMetaType が返されます。
この関数は Qt 6.0 で導入されました。
parameterCount()、returnMetaType()、およびQMetaTypeも参照してください 。
QList<QByteArray> QMetaMethod::parameterNames() const
パラメータ名のリストを返します。
parameterTypes() およびmethodSignature()も参照してください 。
int QMetaMethod::parameterType(int index) const
指定されたindex におけるパラメータの型を返します。
戻り値は、QMetaType に登録されている型のいずれか、または型が登録されていない場合はQMetaType::UnknownType となります。
parameterCount()、parameterMetaType()、returnType()、およびQMetaTypeも参照してください 。
[since 6.0] QByteArray QMetaMethod::parameterTypeName(int index) const
位置index にある型の名前を返します。index にパラメータが存在しない場合は、空のQByteArray
この関数は Qt 6.0 で導入されました。
parameterNames()も参照してください 。
QList<QByteArray> QMetaMethod::parameterTypes() const
パラメータの型のリストを返します。
parameterNames() およびmethodSignature()も参照してください 。
[since 6.0] int QMetaMethod::relativeMethodIndex() const
このメソッドのローカルインデックスを返します。
この関数は Qt 6.0 で導入されました。
[since 6.0] QMetaType QMetaMethod::returnMetaType() const
このメソッドの戻り値の型を返します。
この関数は Qt 6.0 で導入されました。
parameterMetaType()、QMetaType 、およびtypeName()も参照してください 。
int QMetaMethod::returnType() const
このメソッドの戻り値の型を返します。
戻り値は、QMetaType に登録されている型のいずれか、あるいは型が登録されていない場合はQMetaType::UnknownType となります。
parameterType()、QMetaType 、typeName()、およびreturnMetaType()も参照してください 。
int QMetaMethod::revision() const
Q_REVISION でメソッドのリビジョンが指定されている場合はそれを返し、そうでない場合は0を返します。Qt 6.0以降、0以外の値はエンコードされており、QTypeRevision::fromEncodedVersion() を使用してデコードできます。
const char *QMetaMethod::tag() const
このメソッドに関連付けられているタグを返します。
タグは、moc によって認識される特別なマクロであり、メソッドに関する追加情報を付加することを可能にします。
タグ情報は、関数宣言内で次のように追加できます:
// In the class MainWindow declaration
#ifndef Q_MOC_RUN
// define the tag text as empty, so the compiler doesn't see it
# define MY_CUSTOM_TAG
#endif
//...
private slots:
MY_CUSTOM_TAG void testFunc();また、その情報には次のようにしてアクセスできます:
MainWindow win;
win.show();
intfunctionIndex=win.metaObject()->indexOfSlot("testFunc()");
QMetaMethod mm=win.metaObject()->method(functionIndex);
qDebug() << mm.tag(); // prints MY_CUSTOM_TAG現時点では、moc はすべてのタグを抽出して記録しますが、それらを特別に処理することはありません。これらのタグを使用してメソッドにさまざまな注釈を付け、アプリケーションの具体的なニーズに応じて処理することができます。
注: moc は プリプロセッサマクロを展開するため、上記の例に示すように、定義を `#ifndef ` と `Q_MOC_RUN` で囲む必要があります。
const char *QMetaMethod::typeName() const
このメソッドの戻り値の型名を返します。このメソッドがコンストラクタである場合、この関数は空の文字列を返します(コンストラクタには戻り値の型がありません)。
注: Qt 7では 、この関数はコンストラクタに対して null ポインタを返します。
関連項目: returnType() およびQMetaType::name()。
関連する非メンバ
[noexcept] bool operator!=(const QMetaMethod &lhs, const QMetaMethod &rhs)
メソッド `lhs ` がメソッド `rhs` と等しくない場合は `true ` を返し、そうでない場合は `false` を返します。
[noexcept] bool operator==(const QMetaMethod &lhs, const QMetaMethod &rhs)
メソッド `lhs ` がメソッド `rhs` と等しい場合は `true ` を返し、そうでない場合は `false` を返します。
マクロのドキュメント
[until 6.13] Q_METAMETHOD_INVOKE_MAX_ARGS
このマクロは、バージョン 6.13 で非推奨となる予定です。
これは、QMetaMethod::invoke() の旧実装によるメソッドの実行で利用可能な引数の最大数に相当します。新しい実装(Qt 6.5以降)では可変長引数が使用されており、上限はありません。
© 2026 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.