QMetaMethod类
QMetaMethod类提供了关于成员函数的元数据。 更多...
头文件 | #include <QMetaMethod> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake | QT += core |
公共类型
公共函数
QMetaMethod::Access | access() const |
(since 6.5) bool | invoke(QObject *obj, Qt::ConnectionType type, 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, QTemplatedMetaMethodReturnArgument<ReturnArg> ret, Args &&... arguments) const |
(since 6.5) bool | invoke(QObject *obj, Args &&... arguments) const |
(since 6.5) bool | invokeOnGadget(void *gadget, QTemplatedMetaMethodReturnArgument<ReturnArg> ret, Args &&... arguments) const |
(since 6.5) bool | invokeOnGadget(void *gadget, 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 &m1, const QMetaMethod &m2) |
bool | operator==(const QMetaMethod &m1, const QMetaMethod &m2) |
宏
详细描述
QMetaMethod具有一个methodType(),一个methodSignature(),一个parameterTypes()和parameterNames()列表,一个返回typeName(),一个tag()和一个access()指定符。您可以使用invoke()在任意QObject上调用该方法。
另请参阅QMetaObject、QMetaEnum、QMetaProperty和Qt属性系统。
成员类型文档
枚举 QMetaMethod::Access
此枚举描述了方法的访问级别,遵循C++中使用的约定。
常数 | 值 |
---|---|
QMetaMethod::Private | 0 |
QMetaMethod::Protected | 1 |
QMetaMethod::Public | 2 |
枚举 QMetaMethod::MethodType
常数 | 值 | 描述 |
---|---|---|
QMetaMethod::Method | 0 | 该函数是一个普通的成员函数。 |
QMetaMethod::Signal | 1 | 该函数是一个信号。 |
QMetaMethod::Slot | 2 | 该函数是一个槽。 |
QMetaMethod::Constructor | 3 | 该函数是一个构造函数。 |
成员函数文档
[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 的元方法,或在 signal 是 nullptr
或不是类的信号时返回一个无效的 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(),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。
© 2024 Qt 公司有限公司。本文档中包含的文档贡献的版权属于各自的所有者。本提供的文档按照自由软件基金会发布的 GNU 自由文档许可 1.3 版 的条款进行许可。Qt 和相应的标志是芬兰以及世界其他地区的 Qt 公司的商标。所有其他商标均为各自所有者的财产。