QMetaMethod类

QMetaMethod类提供了关于成员函数的元数据。 更多...

头文件 #include <QMetaMethod>
CMakefind_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmakeQT += core

公共类型

枚举访问 { 私有, 保护, 公共 }
枚举方法类型 { 方法, 信号, 槽, 构造函数 }

公共函数

QMetaMethod::Accessaccess() const
(since 6.5) boolinvoke(QObject *obj, Qt::ConnectionType type, QTemplatedMetaMethodReturnArgument<ReturnArg> ret, Args &&... arguments) const
(since 6.5) boolinvoke(QObject *obj, Qt::ConnectionType type, Args &&... arguments) const
(since 6.5) boolinvoke(QObject *obj, QTemplatedMetaMethodReturnArgument<ReturnArg> ret, Args &&... arguments) const
(since 6.5) boolinvoke(QObject *obj, Args &&... arguments) const
(since 6.5) boolinvokeOnGadget(void *gadget, QTemplatedMetaMethodReturnArgument<ReturnArg> ret, Args &&... arguments) const
(since 6.5) boolinvokeOnGadget(void *gadget, Args &&... arguments) const
(since 6.2) boolisConst() const
boolisValid() const
intmethodIndex() const
QByteArraymethodSignature() const
QMetaMethod::MethodTypemethodType() const
QByteArrayname() const
intparameterCount() const
(since 6.0) QMetaTypeparameterMetaType(int index) const
QList<QByteArray>parameterNames() const
intparameterType(int index) const
(since 6.0) QByteArrayparameterTypeName(int index) const
QList<QByteArray>parameterTypes() const
(since 6.0) intrelativeMethodIndex() const
(since 6.0) QMetaTypereturnMetaType() const
intreturnType() const
intrevision() const
const char *tag() const
const char *typeName() const

静态公共成员

QMetaMethodfromSignal(PointerToMemberFunction signal)
booloperator!=(const QMetaMethod &m1, const QMetaMethod &m2)
booloperator==(const QMetaMethod &m1, const QMetaMethod &m2)

详细描述

QMetaMethod具有一个methodType(),一个methodSignature(),一个parameterTypes()和parameterNames()列表,一个返回typeName(),一个tag()和一个access()指定符。您可以使用invoke()在任意QObject上调用该方法。

另请参阅QMetaObjectQMetaEnumQMetaPropertyQt属性系统

成员类型文档

枚举 QMetaMethod::Access

此枚举描述了方法的访问级别,遵循C++中使用的约定。

常数
QMetaMethod::Private0
QMetaMethod::Protected1
QMetaMethod::Public2

枚举 QMetaMethod::MethodType

常数描述
QMetaMethod::Method0该函数是一个普通的成员函数。
QMetaMethod::Signal1该函数是一个信号。
QMetaMethod::Slot2该函数是一个槽。
QMetaMethod::Constructor3该函数是一个构造函数。

成员函数文档

[since 6.5] 模板 <typename... Args> bool QMetaMethod::invoke(QObject *obj, Args &&... arguments) const

[since 6.5] 模板 <typename ReturnArg, typename... Args> bool QMetaMethod::invoke(QObject *obj, QTemplatedMetaMethodReturnArgument<ReturnArg> ret, Args &&... arguments) const

[since 6.5] 模板 <typename... Args> bool QMetaMethod::invoke(QObject *obj, Qt::ConnectionType type, Args &&... arguments) const

[since 6.5] 模板 <typename ReturnArg, typename... Args> bool QMetaMethod::invoke(QObject *obj, Qt::ConnectionType type, QTemplatedMetaMethodReturnArgument<ReturnArg> ret, Args &&... arguments) const

在对象object上调用此方法。如果成员函数可以调用,则返回true。如果没有此类成员或参数不匹配,则返回false

对于具有 QTemplatedMetaMethodReturnArgument 参数的重载,成员函数调用的返回值被放置在 ret 中。对于没有此类成员的重载,被调用函数(如果有的话)的返回值将被丢弃。QTemplatedMetaMethodReturnArgument 是一个不可直接使用的内部类型。相反,请使用 qReturnArg() 函数。

具有 Qt::ConnectionType 类型 参数的重载允许显式选择调用是同步还是异步。

  • 如果 类型Qt::DirectConnection,则成员将立即在当前线程中调用。
  • 如果 类型Qt::QueuedConnection,将发送一个 QEvent,并且当应用程序进入在创建或移动 obj 的线程的事件循环时,将调用成员。
  • 如果 类型Qt::BlockingQueuedConnection,则方法的调用方式与 Qt::QueuedConnection 相同,区别在于当前线程将在事件传递之前阻塞。使用此连接类型在同一线程内的对象之间进行通信会导致死锁。
  • 如果 类型Qt::AutoConnection,如果 obj 与调用者位于同一线程,则成员将同步调用;否则,它将异步调用成员。这是我们不带 类型 参数的重载的行为。

异步调用 animateClick() 插槽在 QPushButton

int methodIndex = pushButton->metaObject()->indexOfMethod("animateClick()");
QMetaMethod method = metaObject->method(methodIndex);
method.invoke(pushButton, Qt::QueuedConnection);

在异步方法调用中,参数必须是可复制的类型,因为 Qt 需要复制参数以将它们存储在后台事件中。从 Qt 6.5 开始,此函数自动注册正在使用的类型;然而,作为副作用,不能使用仅是前置声明的类型进行调用。此外,也不能使用引用非 const-qualified 类型的参数进行异步调用。

以同步方式调用某任意对象 obj 上的 compute(QString, int, double) 插槽以获取其返回值

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

警告:此方法将不测试参数的有效性:对象 必须是与此 QMetaObject 的类有关联的类的实例,而这个 QMetaMethod 就是用这个 QMetaMethod 构建的。

此函数从 Qt 6.5 开始引入。

另请参阅 Q_ARG()、Q_RETURN_ARG()、qRegisterMetaType() 和 QMetaObject::invokeMethod().

[since 6.5] 模板 <typename... Args> bool QMetaMethod::invokeOnGadget(void *gadget, Args &&... arguments) const

[since 6.5] 模板 <typename ReturnArg, typename... Args> bool QMetaMethod::invokeOnGadget(void *gadget, QTemplatedMetaMethodReturnArgument<ReturnArg> ret, Args &&... arguments) const

Q_GADGET 上调用此方法。如果成员可以调用,则返回 true;如果没有这样的成员或参数不匹配,则返回 false

指针 gadget 必须指向设备类的实例。

调用始终是同步的。

对于具有 QTemplatedMetaMethodReturnArgument 参数的重载,成员函数调用的返回值放置在 ret 中。对于没有它的重载,调用函数的返回值(如果有)将被丢弃。QTemplatedMetaMethodReturnArgument 是一个内部类型,您不应直接使用。相反,使用 qReturnArg() 函数。

注意:此方法不会验证参数的有效性:gadget 必须是与此 QMetaObject 的类相同的类的实例。

此函数从 Qt 6.5 开始引入。

另请参阅 Q_ARG()、Q_RETURN_ARG()、qRegisterMetaType() 和 QMetaObject::invokeMethod().

QMetaMethod::Access QMetaMethod::access() const

返回此方法的访问指定(私有、保护或公共)。

注意:信号始终是公共的,但您应将其视为实现细节。从类外部发出信号几乎总是坏主意。

另请参阅:methodType()。

[静态] 模板 <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 编译的库,则此方法可能错误地返回 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()。

[自 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

[自 6.0 开始] QByteArray QMetaMethod::parameterTypeName(int index) const

返回位置 index 的类型名称。如果没有位于 index 的参数,则返回空的 QByteArray

此功能自 Qt 6.0 开始引入。

另请参阅 parameterNames()。

QList<QByteArray> QMetaMethod::parameterTypes() const

返回参数类型列表。

另请参阅 parameterNames() 和 methodSignature()。

[自 6.0 开始] int QMetaMethod::relativeMethodIndex() const

返回此方法在内部中的局部索引。

此功能自 Qt 6.0 开始引入。

[自 6.0 开始] QMetaType QMetaMethod::returnMetaType() const

返回此方法的返回类型。

此功能自 Qt 6.0 开始引入。

另请参阅 parameterMetaType(),QMetaType,以及 typeName

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 &m1, const QMetaMethod &m2)

这是一个重载函数。

如果方法 m1 不等于方法 m2,则返回 true,否则返回 false

[noexcept] bool operator==(const QMetaMethod &m1, const QMetaMethod &m2)

这是一个重载函数。

如果方法 m1 等于方法 m2,则返回 true,否则返回 false

宏文档

Q_METAMETHOD_INVOKE_MAX_ARGS

等于通过 QMetaMethod::invoke() 执行方法时可用的最大参数数量

© 2024 Qt 公司有限公司。本文档中包含的文档贡献的版权属于各自的所有者。本提供的文档按照自由软件基金会发布的 GNU 自由文档许可 1.3 版 的条款进行许可。Qt 和相应的标志是芬兰以及世界其他地区的 Qt 公司的商标。所有其他商标均为各自所有者的财产。