Qt:QMetaObject结构体

1059 篇文章 285 订阅

QMetaObject类包含有关Qt对象的元信息。

头文件:

#include <QMetaObject>

cmake:

find_package(Qt6 COMPONENTS Core REQUIRED)
target_link_libraries(mytarget PRIVATE Qt6::Core)

qmake:

QT += core

详细说明

Qt中的元对象系统负责信号和对象之间的通信机制、运行时类型信息和Qt属性系统。为应用程序中使用的每个QObject子类创建一个QMeatObject实例,该实例存储QObject子类的私有元信息。该对象可以通过QObject::metaObject()获得

应用程序编程通常不需要这个类,但是如果您编写元应用程序(比如脚本引擎或者GUI构建器),这个类就很有用

您可能会发现这些函数是有用的:

  • className()返回一个类名称
  • superClass()返回超类的元对象。
  • method()和methodCount()提供了关于类的元方法(信号、槽和其他可调用成员函数)的信息。
  • enumerator()和enumeratorCount(),提供关于类的枚举数的信息。
  • propertyCount()和property()提供了关于类属性的信息。
  • constructor()和constructorCount()提供了关于类的元构造函数的信息。

索引函数indexOfConstructor()、indexOfMethod()、indexOfEnumerator()和indexOfProperty()将构造函数、成员函数、枚举数或属性的名称映射到元对象的索引。比如,当您将信号连接到槽时,Qt在内部调用indexOfMethod()

类还可以有一个附加类信息的名称-值对列表,存储在QMetaClassInfo对象中。对的数目由classInfo()返回,单个对由classInfo()返回,您可以使用indexOfClassInfo()搜索对。

注意:使用元对象系统的操作通常是线程安全的,因为QMetaObjects通常是编译时生成的静态只读实例。但是,如果元对象由应用程序动态修改(例如,在使用QQmlPropertyMap时),则应用程序必须显式同步对相应元对象的访问。

另外参见: QMetaClassInfo, QMetaEnum, QMetaMethod, QMetaProperty, QMetaType, Meta-Object System.

成员函数

checkConnectArgs

[static]
bool QMetaObject::checkConnectArgs(const char *signal, const char *method)

[static, since 5.0]
bool QMetaObject::checkConnectArgs(const QMetaMethod &signal, const QMetaMethod &method)

如果信号参数和方法参数兼容则返回true;否则返回false。

classInfo

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

classInfoCount

int QMetaObject::classInfoCount() const

返回该类中类信息的项数。
另请参见: classInfo(), classInfoOffset(), indexOfClassInfo().

classInfoOffset

int QMetaObject::classInfoOffset() const

返回该类的类信息偏移量,即该类的第一个类信息项的索引位置。

如果类没有包含类信息的超类,则偏移量为0;否则,偏移量是类的超类中所有类信息项的总和。

另请参见: classInfo(), classInfoCount(), indexOfClassInfo().

className

const char *QMetaObject::className() const

返回类名。

另请参见: superClass().

connectSlotsByName

[static]
void QMetaObject::connectSlotsByName(QObject *object)

递归搜索给定对象的所有子对象,并将这些子对象的匹配信号连接到遵循以下形式的对象插槽:

void on_<object name>_<signal name>(<signal parameters>);

假设我们的对象有一个子对象,其类型QPushButton,对象名为button1。捕捉按钮的clicked()信号的槽将是:

void on_button1_clicked();

如果对象本身具有正确设置的对象名称,则其自身的信号也将连接到其各自的插槽。

另请参见:QObject::setObjectName().

constructor

QMetaMethod QMetaObject::constructor(int index) const

返回具有给定index的构造方法的元数据。

另请参见:constructorCount() 、 newInstance().

constructorCount

int QMetaObject::constructorCount() const

返回该类中构造函数的数目。

另请参见:constructor() 、 indexOfConstructor().

enumerator

QMetaEnum QMetaObject::enumerator(int index) const

返回具有给定索引的枚举数的元数据。

另请参见:enumeratorCount(), enumeratorOffset(), indexOfEnumerator().

enumeratorCount

int QMetaObject::enumeratorCount() const

返回该类中枚举数的数目。

enumeratorOffset

int QMetaObject::enumeratorOffset() const

返回这个类的枚举数偏移量;即该类的第一个枚举数的索引位置。

如果该类没有带枚举数的超类,则偏移量为0;否则,偏移量是该类超类中所有枚举数的总和。

indexOfClassInfo

int QMetaObject::indexOfClassInfo(const char *name) const

查找类信息项名并返回其索引;否则返回1。

另请参见:classInfo(), classInfoCount(), classInfoOffset().

indexOfConstructor

int QMetaObject::indexOfConstructor(const char *constructor) const

查找构造函数并返回其索引;否则返回1。

注意,构造函数必须是标准化形式,就像normalizedSignature()返回的那样。

另请参见:constructor(), constructorCount(), normalizedSignature().

indexOfEnumerator

int QMetaObject::indexOfEnumerator(const char *name) const

查找枚举数名称并返回其索引;否则返回1。

另请参见:enumerator(), enumeratorCount(), enumeratorOffset()..

indexOfMethod

int QMetaObject::indexOfMethod(const char *method) const

查找方法并返回其索引;否则返回1。

注意,该方法必须是标准化形式,由normalizedSignature()返回。

另请参见:method(), methodCount(), methodOffset(), normalizedSignature().

indexOfProperty

int QMetaObject::indexOfProperty(const char *name) const

查找属性名并返回其索引;否则返回1。

另请参见:property(), propertyCount(), propertyOffset()..

indexOfSignal

int QMetaObject::indexOfSignal(const char*signal) const

查找信号并返回其索引;否则返回1。

这与indexOfMethod()相同,只是如果方法存在但不是信号,它将返回-1。

注意,信号必须是标准化形式,由normalizedSignature()返回。

另请参见:indexOfMethod(), normalizedSignature(), method(), methodCount(), methodOffset().

indexOfSlot

查找槽位并返回其索引;否则返回1。

这与indexOfMethod()相同,只是如果方法存在但不是槽,它将返回-1。

int QMetaObject::indexOfSlot(const char *slot) const

另请参见:indexOfMethod(), method(), methodCount(), methodOffset().

inherits

[since 5.7]
bool QMetaObject::inherits(const QMetaObject *metaObject) const

如果QMetaObject描述的类继承了metaObject描述的类型,则返回true;否则返回false。

类型被认为是继承自身。

这个函数是在Qt 5.7中引入的。

invokeMethod

[static]
bool QMetaObject::invokeMethod(QObject *obj, const char *member, Qt::ConnectionType type, QGenericReturnArgument ret, QGenericArgument val0 = QGenericArgument(nullptr), QGenericArgument val1 = QGenericArgument(), QGenericArgument val2 = QGenericArgument(), QGenericArgument val3 = QGenericArgument(), QGenericArgument val4 = QGenericArgument(), QGenericArgument val5 = QGenericArgument(), QGenericArgument val6 = QGenericArgument(), QGenericArgument val7 = QGenericArgument(), QGenericArgument val8 = QGenericArgument(), QGenericArgument val9 = QGenericArgument())

调用对象obj上的成员(信号或槽名)。如果可以调用该成员,则返回true。如果没有这样的成员或形参不匹配,则返回false。

调用可以是同步的,也可以是异步的,这取决于type:

  • 如果type为Qt::DirectConnection,该成员将立即被调用。
  • 如果type为Qt::QueuedConnection,当应用程序进入主事件循环时,将发送QEvent并调用成员。
  • 如果类型是Qt::BlockingQueuedConnection,这个方法将被调用的方式与Qt::QueuedConnection相同,除了当前线程将阻塞直到事件被传递为止。使用此连接类型在同一线程中的对象之间进行通信将导致死锁。
  • 如果type为Qt::AutoConnection,则当obj与调用者位于同一线程的情况下,成员被同步调用;否则,它将异步调用该成员。

成员函数调用的返回值被放置在ret中。如果调用是异步的,则返回值不能被求值。最多可以传递10个参数(val0、val1、val2、val3、val4、val5、val6、val7、val8和val9)给成员函数。

QGenericArgumentQGenericReturnArgument是内部帮助器类。因为可以动态调用信号和插槽,所以必须使用Q_ARG()Q_RETURN_ARG()宏封装参数。Q_ARG()接受类型名和该类型的const引用;Q_RETURN_ARG()接受类型名和非const引用。

您只需要将信号或槽的名称传递给这个函数,而不需要传递整个签名。例如,要异步调用QThread上的quit()槽,使用以下代码:

QMetaObject::invokeMethod(thread, "quit",
                          Qt::QueuedConnection);

对于异步方法调用,参数必须是Qt元对象系统已知的类型,因为Qt需要复制参数,将它们存储在幕后的事件中。如果尝试使用队列连接并获取错误消息

QMetaObject::invokeMethod: Unable to handle unregistered datatype 'MyType'

在调用invokeMethod()之前,调用**qRegisterMetaType()**注册数据类型。

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

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

如果“compute”槽没有按照指定的顺序接受一个QString、一个int和一个double,调用将失败。

注意:这个函数是线程安全的。

另请参见: Q_ARG(), Q_RETURN_ARG(), qRegisterMetaType(), QMetaMethod::invoke().

[static]
bool QMetaObject::invokeMethod(QObject*obj, const char*member, QGenericReturnArgument ret, QGenericArgument val0 = QGenericArgument(0), QGenericArgument val1 = QGenericArgument(), QGenericArgument val2 = QGenericArgument(), QGenericArgument val3 = QGenericArgument(), QGenericArgument val4 = QGenericArgument(), QGenericArgument val5 = QGenericArgument(), QGenericArgument val6 = QGenericArgument(), QGenericArgument val7 = QGenericArgument(), QGenericArgument val8 = QGenericArgument(), QGenericArgument val9 = QGenericArgument())

这个函数重载invokeMethod()。

这个重载总是使用连接类型Qt::AutoConnection调用成员。

注意:这个函数是线程安全的。

[static]
bool QMetaObject::invokeMethod(QObject *obj, const char *member, Qt::ConnectionType type, QGenericArgument val0 = QGenericArgument(0), QGenericArgument val1 = QGenericArgument(), QGenericArgument val2 = QGenericArgument(), QGenericArgument val3 = QGenericArgument(), QGenericArgument val4 = QGenericArgument(), QGenericArgument val5 = QGenericArgument(), QGenericArgument val6 = QGenericArgument(), QGenericArgument val7 = QGenericArgument(), QGenericArgument val8 = QGenericArgument(), QGenericArgument val9 = QGenericArgument())

这个函数重载invokeMethod()。

如果对成员的返回值不感兴趣,可以使用此重载。

注意:这个函数是线程安全的。

[static]
bool QMetaObject::invokeMethod(QObject *obj, const char *member, QGenericArgument val0 = QGenericArgument(0), QGenericArgument val1 = QGenericArgument(), QGenericArgument val2 = QGenericArgument(), QGenericArgument val3 = QGenericArgument(), QGenericArgument val4 = QGenericArgument(), QGenericArgument val5 = QGenericArgument(), QGenericArgument val6 = QGenericArgument(), QGenericArgument val7 = QGenericArgument(), QGenericArgument val8 = QGenericArgument(), QGenericArgument val9 = QGenericArgument())

这个函数重载invokeMethod()。

这个重载使用连接类型Qt::AutoConnection调用成员,并忽略返回值。

注意:这个函数是线程安全的。

[static, since 5.10]
template <typename Functor, typename FunctorReturnType> bool QMetaObject::invokeMethod(QObject *context, Functor function, Qt::ConnectionType type = Qt::AutoConnection, FunctorReturnType *ret = nullptr)

这是一个重载函数。

在上下文的事件循环中调用函数。函数可以是仿函数或成员函数的指针。如果函数可以被调用,则返回true。如果没有这样的函数或形参不匹配,则返回false。函数调用的返回值位于ret中。

注意:这个函数是线程安全的。

这个函数是在Qt 5.10中引入的。

[static, since 5.10]
template <typename Functor, typename FunctorReturnType> bool QMetaObject::invokeMethod(QObject *context, Functor function, FunctorReturnType *ret)

这是一个重载函数。

使用连接类型Qt::AutoConnection在上下文的事件循环中调用函数。函数可以是仿函数或成员函数的指针。如果函数可以被调用,则返回true。如果没有这样的成员或形参不匹配,则返回false。函数调用的返回值位于ret中。

注意:这个函数是线程安全的。

这个函数是在Qt 5.10中引入的。

method

QMetaMethod QMetaObject::method(int index) const

返回具有给定索引的方法的元数据。

另请参见:methodCount(), methodOffset(), indexOfMethod().

methodCount

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

methodOffset

int QMetaObject::methodOffset() const

返回该类的方法偏移量,即该类第一个成员函数的索引位置。

偏移量是类的超类中所有方法的总和(因为QObject有deleteLater()槽和destromed()信号,所以它总是正的)。

int QMetaObject::methodOffset() const

newInstance

QObject *QMetaObject::newInstance(QGenericArgument val0 = QGenericArgument(nullptr), QGenericArgument val1 = QGenericArgument(), QGenericArgument val2 = QGenericArgument(), QGenericArgument val3 = QGenericArgument(), QGenericArgument val4 = QGenericArgument(), QGenericArgument val5 = QGenericArgument(), QGenericArgument val6 = QGenericArgument(), QGenericArgument val7 = QGenericArgument(), QGenericArgument val8 = QGenericArgument(), QGenericArgument val9 = QGenericArgument()) const

构造这个类的新实例。最多可以向构造函数传递10个参数(val0、val1、val2、val3、val4、val5、val6、val7、val8和val9)。返回新的对象,如果没有合适的构造函数,则返回nullptr。

注意,只有用Q_INVOKABLE修饰符声明的构造函数才可以通过元对象系统使用。

参见Q_ARG()和constructor()。

normalizedSignature

[static]
QByteArray QMetaObject::normalizedSignature(const char *method)

规格化给定方法的签名。

Qt使用规范化签名来决定两个给定的信号和插槽是否兼容。规范化将空格减少到最小,将’const’移到适当的位置,从值类型中移除’const’并将const引用替换为值。

另请参见:checkConnectArgs() 、 normalizedType().

normalizedType

[static]
QByteArray QMetaObject::normalizedType(const char *type)

使一种规范化。

请参阅QMetaObject::normalizedSignature()获得Qt规范化的描述。

QByteArray normType = QMetaObject::normalizedType(" int    const  *");
// normType is now "const int*"

property

QMetaProperty QMetaObject::property(int index) const

返回具有给定索引的属性的元数据。如果不存在这样的属性,则返回空QMetaProperty。

另请参见:propertyCount(), propertyOffset(), indexOfProperty().

propertyCount

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

propertyOffset

int QMetaObject::propertyOffset() const

返回这个类的属性偏移量;也就是这个类的第一个属性的索引位置。

偏移量是类超类中所有属性的总和(总是正的,因为QObject有name()属性)。

另请参见:property(), propertyCount(), indexOfProperty().

superClass

const QMetaObject*QMetaObject::superClass() const

返回超类的元对象,如果没有这样的对象则返回nullptr。

另请参见:className().

userProperty

QMetaProperty QMetaObject::userProperty() const

返回将用户标志设置为true的属性。

另请参见:QMetaProperty::isUser().

宏文档

Q_ARG

QGenericArgument Q_ARG(Type, const Type &value)

另请参见:Q_RETURN_ARG().

这个宏接受一个类型和该类型的值,并返回一个QGenericArgument对象,该对象可以传递给QMetaObject::invokeMethod()。

Q_RETURN_ARG

QGenericReturnArgument Q_RETURN_ARG(Type, Type &value)

这个宏接受一个类型和对该类型值的非const引用,并返回一个QGenericReturnArgument对象,该对象可以传递给QMetaObject::invokeMethod()。

另请参见:Q_ARG

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值