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::Private | 0 |
QMetaMethod::Protected | 1 |
QMetaMethod::Public | 2 |
enum QMetaMethod::MethodType
定数 | 値 | 説明 |
---|---|---|
QMetaMethod::Method | 0 | この関数はプレーンなメンバ関数です。 |
QMetaMethod::Signal | 1 | この関数はシグナルです。 |
QMetaMethod::Slot | 2 | この関数はスロットです。 |
QMetaMethod::Constructor | 3 | この関数はコンストラクタです。 |
メンバ関数の説明
[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 、int
、double
を、指定された順番で正確に取らない場合、呼び出しは失敗する。文字リテラルは正確にマッチする型ではないので、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 パラメータを持たないオーバーロードの場合、呼び出された関数の返り値(もしあれば)は破棄されます。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 に対応するメタメソッドを返します。signal がnullptr
であるか、そのクラスのシグナルでない場合は、無効な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()、QMetaType 、typeName()も参照してください 。
int QMetaMethod::returnType() const
このメソッドの戻り値の型を返します。
戻り値は、QMetaType で登録されている型のいずれか、または型が登録されていない場合はQMetaType::UnknownType です。
parameterType()、QMetaType 、typeName()、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
を返す。
本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。