QMetaMethod Class

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

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

このクラスは等価比較可能です。

パブリック型

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
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()のリスト、returntypeName()、tag()、access()指定子を持ちます。invoke() を使用すると、任意のQObject に対してメソッドを呼び出すことができます。

QMetaObject,QMetaEnum,QMetaProperty,Qt のプロパティシステムも参照してください

メンバ型のドキュメント

enum QMetaMethod::Access

この列挙型は、C++で使用されている慣例に従って、メソッドのアクセス・レベルを記述します。

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

enum QMetaMethod::MethodType

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

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

[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 パラメータを持つオーバーロードでは、呼び出しを同期的に行うかどうかを明示的に選択できます:

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

QPushButtonanimateClick() スロットを非同期に呼び出す:

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 "スロットが、QStringintdouble を、指定された順番で正確に取らない場合、呼び出しは失敗する。文字リテラルは正確にマッチする型ではないので、QString の型を明示する必要があったことに注意してください。このメソッドがQByteArrayqint64long 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 パラメータを持たないオーバーロードの場合、呼び出された関数の返り値(もしあれば)は破棄されます。QTemplatedMetaMethodReturnArgumentは、直接使用してはならない内部型です。代わりにqReturnArg()関数を使用してください。

警告: このメソッドは引数の妥当性をテストしません:gadget は、このQMetaMethod が構築されたQMetaObject のクラスのインスタンスでなければなりません。

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

Q_ARG(),Q_RETURN_ARG(),qRegisterMetaType(),QMetaObject::invokeMethod()も参照してください

QMetaMethod::Access QMetaMethod::access() const

このメソッドのアクセス指定(private、protected、public)を返します。

注意: シグナルは常にpublicですが、これは実装の詳細と考えるべきです。クラスの外からシグナルを発信するのは、ほとんどの場合悪い考えです。

methodType()も参照

[static] template <typename PointerToMemberFunction> QMetaMethod QMetaMethod::fromSignal(PointerToMemberFunction signal)

指定されたsignal に対応するメタメソッドを返します。signalnullptr であるか、クラスのシグナルでない場合は無効なQMetaMethod を返します。

QMetaMethod destroyedSignal = QMetaMethod::fromSignal(&QObject::destroyed);

[since 6.2] bool QMetaMethod::isConst() const

メソッドが const 修飾されているかどうかを返します。

注意: このメソッドは、古いバージョンの Qt に対してコンパイルされたライブラリに属している場合、const メソッドに対して誤って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()も参照

int QMetaMethod::parameterCount() const

このメソッドのパラメータの数を返します。

parameterType() およびparameterNames()も参照

[since 6.0] QMetaType QMetaMethod::parameterMetaType(int index) const

与えられたindex のパラメータのメタタイプを返す。

index がゼロより小さいか、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()、QMetaTypetypeName()も参照してください

int QMetaMethod::returnType() const

このメソッドの戻り値の型を返します。

戻り値は、QMetaType に登録されている型のいずれかであり、型が登録されていない場合はQMetaType::UnknownType です。

parameterType()、QMetaTypetypeName()、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()");QMetaMethodmm=win.metaObject()->method(functionIndex);    qDebug() << mm.tag(); // prints MY_CUSTOM_TAG

今のところ、moc はすべてのタグを抽出して記録しますが、特別な処理は行いません。タグを使用してメソッドに異なる注釈を付けたり、アプリケーションの特定のニーズに従ってタグを処理することができます。

注: moc はプリプロセッサ・マクロを展開するので、上の例のように、#ifndef Q_MOC_RUN で定義を囲む必要があります。

const char *QMetaMethod::typeName() const

このメソッドの戻り値の型名を返します。

returnType() およびQMetaType::type()も参照してください

関連する非会員

[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 を返す。

マクロ・ドキュメント

Q_METAMETHOD_INVOKE_MAX_ARGS

QMetaMethod::invoke() 経由でメソッドを実行する際に利用可能な引数の最大数と等しい。

© 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.