概述
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)给成员函数。
QGenericArgument
和QGenericReturnArgument
是内部帮助器类。因为可以动态调用信号和插槽,所以必须使用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
最后
以上就是忧郁绿草为你收集整理的Qt:QMetaObject结构体详细说明成员函数宏文档的全部内容,希望文章能够帮你解决Qt:QMetaObject结构体详细说明成员函数宏文档所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复