QMetaMethod Class

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

Header: #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 が 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()、QMetaTypetypeName()も参照してください

int QMetaMethod::returnType() const

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

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

parameterType()、QMetaTypetypeName()、returnMetaType()も参照

int QMetaMethod::revision() const

メソッドのリビジョンがQ_REVISION で指定されている場合はそれを返し、そうでない場合は 0 を返す。

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();

    int functionIndex = 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

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

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() を介したメソッドの実行に利用可能な引数の最大数と等しい。

本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。