QMetaObject Struct 译文

QMetaObject 类包含Qt对象元信息。
头文件:#include <QMetaObject>
qmake: QT += core
 

公共类型

class Connection
 

公共方法

QMetaClassInfoclassInfo(int index) const
intclassInfoCount() const
intclassInfoOffset() const
const char *className() const
QMetaMethodconstructor(int index) const
intconstructorCount() const
QMetaEnumenumerator(int index) const
intenumeratorCount() const
intenumeratorOffset() const
intindexOfClassInfo(const char *name) const
intindexOfConstructor(const char *constructor) const
intindexOfEnumerator(const char *name) const
intindexOfMethod(const char *method) const
intindexOfProperty(const char *name) const
intindexOfSignal(const char *signal) const
int
indexOfSlot(const char * slot) const
boolinherits(const QMetaObject *metaObject) const
QMetaMethodmethod(int index) const
int
methodCount() const
intmethodOffset() const
QObject *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
QMetaPropertyproperty(int index) const
intpropertyCount() const
intpropertyOffset() const
const QMetaObject *superClass() const
QMetaPropertyuserProperty() const

静态公共成员

boolcheckConnectArgs(const char *signal, const char *method)
boolcheckConnectArgs(const QMetaMethod &signal, const QMetaMethod &method)
voidconnectSlotsByName(QObject *object)
bool
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())
boolinvokeMethod(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())
boolinvokeMethod(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())
boolinvokeMethod(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())
boolinvokeMethod(QObject *context, Functor function, Qt::ConnectionType type = Qt::AutoConnection, FunctorReturnType *ret = nullptr)
boolinvokeMethod(QObject *context, Functor function, FunctorReturnType *ret)
QByteArraynormalizedSignature(const char *method)
QByteArraynormalizedType(const char *type)

宏定义

QGenericArgument
Q_ARG( Type, const Type & value)
QGenericReturnArgumentQ_RETURN_ARG(Type, Type &value)
 

详细说明

Qt元对象系统负责信号与槽内部对象交互机制,运行时类型信息,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),那么应用程序必须显示的同步访问各自的元对象。
 
 

成员方法文档

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

如果信号和方法参数匹配则返回true,否则返回false
信号和方法都需要标准化

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

这是一个重载方法。
如果信号和方法参数匹配则返回true,否则返回false
此方法在 Qt5.0 引入

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

[static]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

按照索引返回构造函数的元数据
该方法在 Qt4.5 引入。
查看  constructorCount () 和  newInstance ().

int QMetaObject::constructorCount() const

返回类中构造函数的数量
该方法在 Qt4.5 引入。
查看  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

按名字找到类信息项的索引,没找到返回-1。
查看    classInfo (),  classInfoCount (), 和  classInfoOffset ().

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

查找构造函数的索引,没找到返回-1。
注意 构造函数必须是格式化标准,就像  normalizedSignature () 返回的那样。
该方法在 Qt4.5 引入。
查看    constructor (),  constructorCount (), 和  normalizedSignature ().

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

返回枚举的索引,没找到返回-1。
查看    enumerator (),  enumeratorCount (), 和  enumeratorOffset ().

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

返回方法的索引,没找到返回-1。
注意 方法必须是格式化标准,就像  normalizedSignature () 返回的那样。
查看 method(), methodCount(), methodOffset(), 和 normalizedSignature().

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

返回属性的索引,没有返回-1。
查看  property (),  propertyCount (), 和  propertyOffset ().

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

返回信号的索引,没有返回-1。
和  indexOfMethod () 类似,只是如果方法存在但不是信号,会返回-1。
注意 信号必须是标准格式的,就像  normalizedSignature(). 返回的那样。
查看  indexOfMethod(), normalizedSignature(), method(), methodCount(), 和 methodOffset().

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

返回槽的索引,没有返回-1。
和  indexOfMethod () 类似,只是如果方法存在但不是槽,会返回-1。
查看  indexOfMethod(), method(), methodCount(), 和 methodOffset().

bool QMetaObject::inherits(const QMetaObject *metaObject) const

如果是继承自QMetaObject类型,则返回true,否则返回 false。
被认为是自我类型继承。
该方法在 Qt5.7 引入。

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。
调用方式可以是同步的也可以是异步的,取决于类型:
  • 类型是 Qt::DirectConnection, 立即调用
  • 类型是 Qt::QueuedConnection,当应用程序进入主循环,发送一个 QEvent ,成员立即调用
  • 类型是 Qt::BlockingQueuedConnection,和 Qt::QueuedConnection 的调用方式一致,事件发送前,当前线程阻塞。同线程对象间,使用这种方式通信,会造成死锁
  • 类型是  Qt::AutoConnection,如果 obj 和 调用者在同线程,成员会同步调用。否则成员异步调用
调用成员函数的返回值是ret。如果异步调用,返回值无法评估。你可以传入10个参数。
 
QGenericArgument 和 QGenericReturnArgument 是内部助手类。因为信号和槽可以动态调用,你必须使用 Q_ARG() 和 Q_RETURN_ARG() 宏把参数括起来。Q_ARG() 接收参数类型和常量参数,Q_RETURN_ARG() 接收参数类型和非常量参数。
你只需向此函数传递信号或者槽的名称,而非整个参数签名。例如,要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”槽没有按照规定顺序收到参数,本次调用失败。

注意:此函数线程安全

查看  Q_ARG (),  Q_RETURN_ARG (),  qRegisterMetaType (), 和  QMetaMethod::invoke ().

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 调用成员
注意:此函数线程安全

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()
如果对返回值不感兴趣,可使用此重载。
注意:此函数线程安全

bool QMetaObject::invokeMethod(QObject *obj,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 连接类型调用成员,并忽略返回值。
注意:此函数线程安全

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

这是一个重载函数
在上下文事件循环中使用  Qt::AutoConnection 连接类型 调用函数。参数function可以是一个函数题,或成员函数指针。如果函数可以调用返回true。找不到函数或参数不匹配返回 false。函数返回值放在ret。
注意:此函数线程安全
此函数在 Qt 5.10 引入

QMetaMethod QMetaObject::method(int index) const

返回索引方法的元数据。
查看  methodCount (),  methodOffset (), 和  indexOfMethod ().

int QMetaObject::methodCount() const

返回方法数量,包括每个基类提供的方法数量。信号和槽,也作为普通函数参与计数。
下面代码,将类中method特性传递给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 (), 和  indexOfMethod ().

int QMetaObject::methodOffset() const方法

返回类中的方法偏移量,即第一个方法的索引位置。
偏移量是父类方法的总和(总是正数,因为QObject 有 deleteLater()槽和destroyed()信号)。
查看    method (),  methodCount (), 和  indexOfMethod ().

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个参数。返回新对象,如果没有匹配成功,返回nullptr。
注意:只有用 Q_INVOKABLE 声明符修饰的构造函数才能通过元对象系统使用。
该方法 在 Qt 4.5 引入。
查看    Q_ARG () 和  constructor ().

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

规范化方法签名
Qt 使用规范化签名来决定给定的信号和槽是否兼容。规范化将空格减少到最小,将 ‘const’ 前移到适当的位置,从值类型中移除‘const’并将const引用替换为值。
查看  checkConnectArgs () 和  normalizedType ().

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

规范化类型
如果规范化和   QMetaObject::normalizedSignature () 类似
例子:
QByteArray normType = QMetaObject::normalizedType(" int    const  *");
// normType is now "const int*"

该方法 Qt 4.2 引入
查看  normalizedSignature ().

QMetaProperty QMetaObject::property(int index) const

返回索引属性的元数据,如果没找到,返回null
查看  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 (), and  indexOfProperty ().

const QMetaObject *QMetaObject::superClass() const

返回基类元对象,如果没有返回nullptr
查看 className()。

QMetaProperty QMetaObject::userProperty() const

返回将用户标记设置为true的属性
该方法在 Qt 4.2 引入
查看    QMetaProperty::isUser ()。

宏 文档

QGenericArgument Q_ARG(Type, const Type &value)

这个宏接收一个类型,和该类型的值,返回一个 可以传入QMetaObject::invokeMethod() 的QGenericArgument 对象。
查看  Q_RETURN_ARG ().

QGenericReturnArgument Q_RETURN_ARG(Type, Type &value)

这个宏接收一个类型和,该类型非常量值。返回一个可以传入QMetaObject::invokeMethod() 的QGenericReturnArgument 对象。
查看   Q_ARG ().

 
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值