このページでは

QMetaMethod Class

QMetaMethod クラスは、メンバ関数に関するメタデータを提供します。詳細...

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

QMetaMethodの比較

カテゴリ比較可能な型
equalityQMetaMethod

パブリック型

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)

マクロ

詳細な説明

QMetaMethod には、methodType()、methodSignature()、parameterTypes() およびparameterNames() のリスト、戻り値のtypeName()、tag()、およびaccess() 指定子があります。invoke() を使用すると、任意のQObject に対してメソッドを呼び出すことができます。

QMetaObject 、QMetaEnum 、QMetaProperty 、およびQtのプロパティシステムも参照してください 。

メンバ型のドキュメント

enum QMetaMethod::Access

この列挙型は、C++ で用いられる規約に従い、メソッドのアクセスレベルを表します。

定数値
QMetaMethod::Private0
QMetaMethod::Protected1
QMetaMethod::Public2

enum QMetaMethod::MethodType

定数値説明
QMetaMethod::MethodQMETHOD_CODEこの関数はプレーンなメンバ関数です。
QMetaMethod::Signal1この関数はシグナルです。
QMetaMethod::Slot2この関数はスロットです。
QMetaMethod::Constructor3この関数はコンストラクタです。

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

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.