QMetaObject 类包含Qt对象元信息。
头文件:#include <QMetaObject>
qmake: QT += core
公共类型
class Connection
公共方法
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 |
QMetaMethod | method(int index) const |
int |
methodCount() const
|
int | methodOffset() 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 |
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) |
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())
|
bool | 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()) |
bool | 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()) |
bool | 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()) |
bool | invokeMethod(QObject *context, Functor function, Qt::ConnectionType type = Qt::AutoConnection, FunctorReturnType *ret = nullptr) |
bool | invokeMethod(QObject *context, Functor function, FunctorReturnType *ret) |
QByteArray | normalizedSignature(const char *method) |
QByteArray | normalizedType(const char *type) |
宏定义
QGenericArgument
|
Q_ARG(
Type, const Type &
value)
|
QGenericReturnArgument | Q_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,否则偏移量为父类枚举数量的总和。
int QMetaObject::indexOfClassInfo(const char *name) const
按名字找到类信息项的索引,没找到返回-1。
int QMetaObject::indexOfConstructor(const char *constructor) const
查找构造函数的索引,没找到返回-1。
注意 构造函数必须是格式化标准,就像
normalizedSignature
() 返回的那样。
该方法在 Qt4.5 引入。
int QMetaObject::indexOfEnumerator(const char *name) const
返回枚举的索引,没找到返回-1。int QMetaObject::indexOfMethod(const char *method) const
返回方法的索引,没找到返回-1。
注意 方法必须是格式化标准,就像
normalizedSignature
() 返回的那样。
查看 method(), methodCount(), methodOffset(), 和 normalizedSignature().
int QMetaObject::indexOfProperty(const char *name) const
返回属性的索引,没有返回-1。
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
().