QMetaObject 结构体
QMetaObject 类包含有关 Qt 对象的元信息。 更多信息...
头文件 | #include <QMetaObject> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake | QT += core |
公共类型
类 | 连接 |
公共函数
QMetaClassInfo | classInfo(int index) const |
int | classInfoCount() const |
int | classInfoOffset() const |
const char * | className() const |
QMetaMethod | constructor(int index) const |
int | constructorCount() const |
QMetaEnum | enumerator(int index) const |
int | enumeratorCount() const |
int | enumeratorOffset() const |
int | indexOfClassInfo(const char *name) const |
int | indexOfConstructor(const char *constructor) const |
int | indexOfEnumerator(const char *name) const |
int | indexOfMethod(const char *method) const |
int | indexOfProperty(const char *name) const |
int | indexOfSignal(const char *signal) const |
int | indexOfSlot(const char *slot) const |
bool | inherits(const QMetaObject *metaObject) const |
(since 6.2) QMetaType | metaType() const |
QMetaMethod | method(int index) const |
int | methodCount() const |
int | methodOffset() const |
(since 6.5) QObject * | newInstance(Args &&... arguments) const |
QMetaProperty | property(int index) const |
int | propertyCount() const |
int | propertyOffset() const |
const QMetaObject * | superClass() const |
QMetaProperty | userProperty() const |
静态公共成员
bool | checkConnectArgs(const char *signal, const char *method) |
bool | checkConnectArgs(const QMetaMethod &signal, const QMetaMethod &method) |
void | connectSlotsByName(QObject *object) |
(自 6.5) bool | invokeMethod(QObject *obj, const char *member, Qt::ConnectionType type, QTemplatedMetaMethodReturnArgument<ReturnArg> ret, Args &&... args) |
(自 6.5) bool | invokeMethod(QObject *obj, const char *member, Qt::ConnectionType type, Args &&... args) |
(自 6.5) bool | invokeMethod(QObject *obj, const char *member, QTemplatedMetaMethodReturnArgument<ReturnArg> ret, Args &&... args) |
(自 6.5) bool | invokeMethod(QObject *obj, const char *member, Args &&... args) |
bool | invokeMethod(QObject *context, Functor &&function, Qt::ConnectionType type = Qt::AutoConnection, FunctorReturnType *ret = nullptr) |
bool | invokeMethod(QObject *context, Functor &&function, FunctorReturnType *ret) |
(自 6.7) bool | invokeMethod(QObject *context, Functor &&function, Qt::ConnectionType type, QTemplatedMetaMethodReturnArgument<FunctorReturnType> ret, Args &&... arguments) |
(自 6.7) bool | invokeMethod(QObject *context, Functor &&function, QTemplatedMetaMethodReturnArgument<FunctorReturnType> ret, Args &&... arguments) |
(自 6.7) bool | invokeMethod(QObject *context, Functor &&function, Qt::ConnectionType type, Args &&... arguments) |
(自 6.7) bool | invokeMethod(QObject *context, Functor &&function, Args &&... arguments) |
QByteArray | normalizedSignature(const char *method) |
QByteArray | normalizedType(const char *type) |
宏定义
QMetaMethodArgument | Q(ARG)(Type, const Type &value) |
QMetaMethodReturnArgument | Q_RETURN_ARG(Type, Type &value) |
详细描述
Qt 的 Meta-Object System 负责对象之间的信号和槽交互通信机制、运行时类型信息和 Qt 属性系统。为应用程序中使用的每个 QObject 子类创建一个 QMetaObject 实例,该实例存储了 QObject 子类的所有元信息。此对象可通过 QObject::metaObject() 获取。
此类通常不需要在应用程序编程中使用,但如果你编写元应用程序(例如脚本来或 GUI 构建器),则非常有用。
你可能最有可能找到有用的功能如下
- className() 返回类的名称。
- superClass() 返回基类的元对象。
- method() 和 methodCount() 提供了关于类的元方法(信号、槽以及其他 可调用的 成员函数)的信息。
- enumerator() 和 enumeratorCount() 提供了关于类的枚举信息。
- propertyCount() 和 property() 提供了关于类的属性信息。
- constructor() 和 constructorCount() 提供了关于类的元构造函数信息。
索引函数 indexOfConstructor()、indexOfMethod()、indexOfEnumerator() 和 indexOfProperty() 将构造函数、成员函数、枚举器或属性的名称映射到元对象的索引。例如,当您将信号连接到槽时,Qt 内部会使用 indexOfMethod()。
类还可以有附加类信息的 名称–值 对列表,存储在 QMetaClassInfo 对象中。回传这些对的数量由 classInfoCount() 函数执行,单个对由 classInfo() 函数回传,并且您可以使用 indexOfClassInfo() 函数进行搜索。
注意:使用元对象系统的操作通常是线程安全的,因为 QMetaObjects 通常是在编译时生成的静态只读实例。但是,如果应用程序通过元对象进行动态修改(例如,在调用 QQmlPropertyMap 时),则应用程序必须明确同步对该相应元对象的访问。
另请参阅:QMetaClassInfo、QMetaEnum、QMetaMethod、QMetaProperty、QMetaType 和 元对象系统。
成员函数文档
[静态,自 6.5 版起]
模板 <typename... Args> bool QMetaObject::invokeMethod(QObject *obj, const char *member, Args &&... args)
[静态,自 6.5 版起]
模板 <typename ReturnArg, typename... Args> bool QMetaObject::invokeMethod(QObject *obj, const char *member, QTemplatedMetaMethodReturnArgument<ReturnArg> ret, Args &&... args)
[静态,自 6.5 版起]
模板 <typename... Args> bool QMetaObject::invokeMethod(QObject *obj, const char *member, Qt::ConnectionType type, Args &&... args)
[静态,自 6.5 版起]
模板 <typename ReturnArg, typename... Args> bool QMetaObject::invokeMethod(QObject *obj, const char *member, Qt::ConnectionType type, QTemplatedMetaMethodReturnArgument<ReturnArg> ret, Args &&... args)
在对象 obj 上调用 member(信号或槽的名称)。如果成员可用,则返回 true
。如果没有这样的成员或参数不匹配,则返回 false
。
对于具有 QTemplatedMetaMethodReturnArgument 参数的重载,将 member 函数调用的返回值放入 ret。对于没有此类成员的重载,调用函数的返回值(如果有)将被丢弃。QTemplatedMetaMethodReturnArgument 是一个内部类型,您不应直接使用。相反,使用 qReturnArg() 函数。
具有Qt::ConnectionType 类型参数的重载函数可显式选择调用是同步还是异步的。
- 如果类型是Qt::DirectConnection,则成员函数将在当前线程中立即调用。
- 如果类型是Qt::QueuedConnection,将发送一个QEvent,并且成员函数将在对象创建的线程或被移动到的线程进入事件循环时调用。
- 如果类型是Qt::BlockingQueuedConnection,则方法将按照Qt::QueuedConnection的方式调用,区别在于当前线程将阻塞,直到事件被投递。使用此连接类型在同一线程的元素间通信会导致死锁。
- 如果类型是Qt::AutoConnection,则如果obj位于调用者所在的线程中,成员函数将同步调用;否则将异步调用。这是没有类型参数的重载函数的行为。
您只需传递信号或槽的名称,而不需要传递整个签名。例如,要异步调用quit()槽,使用以下代码:
QMetaObject::invokeMethod(thread, "quit", Qt::QueuedConnection);
异步方法调用中,参数必须是可拷贝的类型,因为Qt需要在场景后的一个事件中存储参数。从Qt 6.5开始,此函数自动注册正在使用的类型;然而,作为副作用,无法使用仅前置声明的类型进行调用。此外,也不允许使用参数为非const修饰的类型进行异步调用。
要同步调用任意对象obj
上的compute(QString, int, double)
槽以检索其返回值。
QString retVal; QMetaObject::invokeMethod(obj, "compute", Qt::DirectConnection, qReturnArg(retVal), QString("sqrt"), 42, 9.7);
如果"compute"槽不按照指定顺序恰好接受一个QString、一个整数和一个双精度浮点数,则调用将失败。注意,必须明确指定QString的类型,因为字符字面量并不完全匹配正确的类型。如果该方法接受一个QStringView、一个qsizetype和一个浮点数,则调用需要写为
QString retVal; QMetaObject::invokeMethod(obj, "compute", Qt::DirectConnection, qReturnArg(retVal), QStringView("sqrt"), qsizetype(42), 9.7f);
可以使用Q_ARG()和Q_RETURN_ARG()宏来执行相同的调用,就像在以下代码中一样:
QString retVal; QMetaObject::invokeMethod(obj, "compute", Qt::DirectConnection, Q_RETURN_ARG(QString, retVal), Q_ARG(QString, "sqrt"), Q_ARG(int, 42), Q_ARG(double, 9.7));
这些宏被保留以与Qt 6.4及更早版本兼容,并且可以自由地与未使用宏的参数混合使用。它们可能在调用使用了typedef对前置声明的类型作为参数或返回类型的函数的罕见情况下是必需的。
注意:此函数是线程安全的。
此函数是在Qt 6.5中引入的。
另请参阅:Q_ARG()、Q_RETURN_ARG()和QMetaMethod::invoke()。
[静态]
模板 <typename Functor, typename FunctorReturnType> bool QMetaObject::invokeMethod(QObject *context, Functor &&function, FunctorReturnType *ret)
[静态]
模板 <typename Functor, typename FunctorReturnType> bool QMetaObject::invokeMethod(QObject *context, Functor &&function, Qt::ConnectionType type = Qt::AutoConnection, FunctorReturnType *ret = nullptr)
调用context的事件循环中的function。 function可以是一个仿函数或成员函数的指针。如果函数可以调用,则返回true
。如果不存在该函数或参数不匹配,则返回false
。函数调用返回值放置在ret中。
如果设置了type,则使用该连接类型调用函数。否则,将使用Qt::AutoConnection。
注意:此函数是线程安全的。
[静态,自6.7版起]
模板 <typename Functor, typename... Args> bool QMetaObject::invokeMethod(QObject *context, Functor &&function, Args &&... arguments)
[静态,自6.7版起]
模板 <typename Functor, typename FunctorReturnType, typename... Args> bool QMetaObject::invokeMethod(QObject *context, Functor &&function, QTemplatedMetaMethodReturnArgument<FunctorReturnType> ret, Args &&... arguments)
[静态,自6.7版起]
模板 <typename Functor, typename... Args> bool QMetaObject::invokeMethod(QObject *context, Functor &&function, Qt::ConnectionType type, Args &&... arguments)
[静态,自6.7版起]
模板 <typename Functor, typename FunctorReturnType, typename... Args> bool QMetaObject::invokeMethod(QObject *context, Functor &&function, Qt::ConnectionType type, QTemplatedMetaMethodReturnArgument<FunctorReturnType> ret, Args &&... arguments)
在context的事件循环中使用arguments调用function。 function可以是一个仿函数或成员函数的指针。如果函数可以调用,则返回true
。函数调用返回值放置在ret中。用于ret参数的对象应通过将您的对象传递给qReturnArg()获得。例如
MyClass *obj = ...; int result = 0; QMetaObject::invokeMethod(obj, &MyClass::myMethod, qReturnArg(result), parameter);
如果设置了type,则使用该连接类型调用函数。否则,将使用Qt::AutoConnection。
注意:此函数是线程安全的。
此函数是在Qt 6.7版中引入的。
[静态]
bool QMetaObject::checkConnectArgs(const char *signal, const char *method)
如果signal和method参数兼容,则返回true
;否则返回false
。
预期signal和method都被规范化。
另请参阅normalizedSignature()。
[静态]
bool QMetaObject::checkConnectArgs(const QMetaMethod &signal, const QMetaMethod &method)
这是一个重载函数。
如果signal和method参数兼容,则返回true
;否则返回false
。
QMetaClassInfo QMetaObject::classInfo(int index) const
返回给定 索引 的类信息项的元数据。
示例
class MyClass : public QObject { Q_OBJECT Q_CLASSINFO("author", "Sabrina Schweinsteiger") Q_CLASSINFO("url", "http://doc.moosesoft.co.uk/1.0/") public: ... };
另请参阅 classInfoCount(),classInfoOffset() 和 indexOfClassInfo()。
int QMetaObject::classInfoCount() const
返回此类中类信息项的数量。
另请参阅 classInfo(),classInfoOffset() 和 indexOfClassInfo()。
int QMetaObject::classInfoOffset() const
返回此类中类信息的偏移量;即此类第一个类信息项的索引位置。
如果没有具有类信息的超类,偏移量为 0;否则偏移量是该类所有父类的所有类信息项之和。
另请参阅 classInfo(),classInfoCount() 和 indexOfClassInfo()。
const char *QMetaObject::className() const
返回类名。
另请参阅 superClass()。
[静态]
void QMetaObject::connectSlotsByName(QObject *object)
递归地搜索指定 对象 的所有子对象,并将匹配的信号从这些对象连接到 对象 的槽中,槽的形式如下
void on_<object name>_<signal name>(<signal parameters>);
假设我们的对象有一个类型为 QPushButton
的子对象,对象名为 button1
。用于捕获按钮的 clicked()
信号的槽会是
void on_button1_clicked();
如果 对象 本身具有正确设置的对象名,则其自己的信号也会连接到相应的槽。
另请参阅 QObject::setObjectName()。
QMetaMethod QMetaObject::constructor(int index) const
返回给定 索引 的构造函数的元数据。
另请参阅 constructorCount() 和 newInstance()。
int QMetaObject::constructorCount() const
返回此类中构造函数的数量。
另请参阅 constructor() 和 indexOfConstructor()。
QMetaEnum QMetaObject::enumerator(int index) const
返回给定 索引 的枚举器的元数据。
另请参阅 enumeratorCount(),enumeratorOffset() 和 indexOfEnumerator()。
int QMetaObject::enumeratorCount() const
返回此类中枚举器的数量。
另请参阅 enumerator()、enumeratorOffset() 和 indexOfEnumerator()。
int QMetaObject::enumeratorOffset() const
返回此类中枚举器的偏移量;即此类第一个枚举器的索引位置。
如果类没有具有枚举器的超类,则偏移量为0;否则,偏移量是类超类中所有枚举器的总和。
另请参阅 enumerator()、enumeratorCount() 和 indexOfEnumerator()。
int QMetaObject::indexOfClassInfo(const char *name) const
查找类信息项目 name 并返回其索引;否则返回 -1。
另请参阅 classInfo()、classInfoCount() 和 classInfoOffset()。
int QMetaObject::indexOfConstructor(const char *constructor) const
查找 constructor 并返回其索引;否则返回 -1。
注意,constructor 必须是规范形式,正如由 normalizedSignature 返回的那样。
另请参阅 constructor()、constructorCount() 和 normalizedSignature()。
int QMetaObject::indexOfEnumerator(const char *name) const
查找枚举器 name 并返回其索引;否则返回 -1。
另请参阅 enumerator()、enumeratorCount() 和 enumeratorOffset()。
int QMetaObject::indexOfMethod(const char *method) const
查找 method 并返回其索引;否则返回 -1。
注意,method 必须是规范形式,正如由 normalizedSignature 返回的那样。
另请参阅 method()、methodCount()、methodOffset() 和 normalizedSignature()。
int QMetaObject::indexOfProperty(const char *name) const
查找属性 name 并返回其索引;否则返回 -1。
另请参阅 property()、propertyCount() 和 propertyOffset()。
int QMetaObject::indexOfSignal(const char *signal) const
查找 signal 并返回其索引;否则返回 -1。
这与 indexOfMethod() 相同,只不过如果方法存在但不是信号,则返回 -1。
注意,signal 必须是规范形式,正如由 normalizedSignature 返回的那样。
另请参阅 indexOfMethod()、normalizedSignature()、method()、methodCount() 和 methodOffset()。
int QMetaObject::indexOfSlot(const char *slot) const
查找slot并返回其索引;否则返回-1。
这和indexOfMethod()相同,除了它会返回-1,如果方法存在但不是函数槽。
另请参阅 indexOfMethod(),method(),methodCount()和methodOffset()。
[noexcept]
bool QMetaObject::inherits(const QMetaObject *metaObject) const
如果此QMetaObject所描述的类继承了metaObject所描述的类型,则返回true
;否则返回false。
一个类型被认为继承了它自己。
[since 6.2]
QMetaType QMetaObject::metaType() const
返回与此元对象相对应的元类型。如果元对象来自命名空间,则返回一个无效的元类型。
此功能从Qt 6.2开始引入。
QMetaMethod QMetaObject::method(int index) const
返回具有给定index的方法的元数据。
另请参阅 methodCount(),methodOffset()和indexOfMethod()。
int QMetaObject::methodCount() const
返回此类中的方法数,包括每个基类提供的方法数。这包括信号、槽和普通成员函数。
使用以下代码来获取一个包含特定类特定方法的QStringList:
const QMetaObject* metaObject = obj->metaObject(); QStringList methods; for(int i = metaObject->methodOffset(); i < metaObject->methodCount(); ++i) methods << QString::fromLatin1(metaObject->method(i).methodSignature());
另请参阅 method(),methodOffset()和
int QMetaObject::methodOffset() const
返回此类的方法偏移量;即此类第一个成员函数的索引位置。
此偏移量是此类所有超类方法的总和(这始终为正,因为QObject有deleteLater()槽和destroyed()信号)。
另请参阅 method(),methodCount()和indexOfMethod()。
[since 6.5]
模板 <typename... Args> QObject *QMetaObject::newInstance(Args &&... arguments) const
构建此类的新实例并返回新对象,如果没有合适的构造函数,则返回nullptr
。将使用arguments的参数类型来查找匹配的构造函数,然后将以与信号槽连接相同的方式将它们传递给它。
请注意,只有使用Q_INVOKABLE修饰符声明的构造函数才可通过元对象系统提供。
此函数是在Qt 6.5中引入的。
另请参阅 constructor()。
[静态]
QByteArray QMetaObject::normalizedSignature(const char *method)
规范化给定方法的签名。
Qt使用规范化签名来确定两个给定的信号和槽是否兼容。规范化将空白减少到最小,将'const'移动到合适的位置,从值类型中移除'const',并将const引用替换为值。
另请参阅checkConnectArgs() 和 normalizedType()。
[静态]
QByteArray QMetaObject::normalizedType(const char *type)
规范化一个类型。
有关Qt如何规范的描述,请参阅 QMetaObject::normalizedSignature
示例
QByteArray normType = QMetaObject::normalizedType(" int const *"); // normType is now "const int*"
另请参阅normalizedSignature()。
QMetaProperty QMetaObject::property(int index) const
返回具有给定 index 的属性的元数据。如果不存在此类属性,则返回 null QMetaProperty。
另请参阅propertyCount(),propertyOffset() 和 indexOfProperty()。
int QMetaObject::propertyCount() const
返回此类中属性的数量,包括基类提供的属性数量。
使用如下代码获取特定于给定类的属性 QStringList:
const QMetaObject* metaObject = obj->metaObject(); QStringList properties; for(int i = metaObject->propertyOffset(); i < metaObject->propertyCount(); ++i) properties << QString::fromLatin1(metaObject->property(i).name());
另请参阅property(),propertyOffset() 和 indexOfProperty()。
int QMetaObject::propertyOffset() const
返回此类属性的偏移量;即此类第一个属性的索引位置。
偏移量是类超类中所有属性的总和(这将始终是正数,因为 QObject 有 name() 属性)。
另请参阅property(),propertyCount() 和 indexOfProperty()。
const QMetaObject *QMetaObject::superClass() const
返回超类的元对象,或者如果不存在这样的对象,则返回 nullptr
。
另请参阅className()。
QMetaProperty QMetaObject::userProperty() const
返回设置了 USER
标志为 true 的属性。
另请参阅QMetaProperty::isUser()。
宏文档
QMetaMethodArgument Q_ARG(Type, const Type &value)
此宏接受一个 Type 和该类型的 value,并返回一个 QMetaMethodArgument,可以与带有 Args &&...
参数的模板 QMetaObject::invokeMethod() 一起传递。
另请参阅Q_RETURN_ARG()。
QMetaMethodReturnArgument Q_RETURN_ARG(Type, Type &value)
此宏接受一个 Type 以及该类型的非const引用 value,并返回一个 QMetaMethodReturnArgument,可以与模板 QMetaObject::invokeMethod() 使用 Args &&...
参数。
另请参阅Q_ARG。
© 2024 Qt公司。此处包含的文档贡献的版权归其各自的所有者。此处提供的文档是根据自由软件基金会发布的 GNU自由文档许可证1.3版 的条款许可的。Qt及其相关标志是芬兰的Qt公司和/或其他国家的商标。所有其他商标均为各自所有者的财产。