QObject三大职责-内省机制

所谓内省是指面向对象语言的一种在运行期间查询对象信息的能力, 比如如果该语句有运行期间检查对象类型的能力,那么我们称它是类型内省(type intropection)的,类型内省可以用来实施多态。

c++的内省比较有限,它仅支持上面所说的类型内省, C++的类型内省是通过运行时类型识别(RTTI)(Run-Time Type Information)中的typeid 以及 dynamic_cast关键字来实现的,举例说明:

// rabbit 派生于 Animal, jump为虚函数
if ( rabbit *p = dynamic_cast<Animal*>(obj))  
{  
   p->jump();  
}  

//我们还可以通过typeid萃取到对象的类型信息,比如对象的名称
std::cout << typeid(obj).name() << std::endl
Qt拓展了C++的内省机制,(实际上,它并没有采用c++的RTTI),而是提供了更为强大的元对象(meta object)机制,来实现内省。要深刻理解Qt的内省机制,首先理解QObject,QObject类是整个Qt对象模型的心脏,Qt对象模型最为核心的功能是提供一种无缝的对象通讯机制,即就是我们所熟知的信号和槽。

Qt的内省实现了
//每个对象可以通过QObject::setObjectName()和QObject::objectName()设置、取得类的实例的名字

FirstQtApp obj; 
obj.setObjectName("instanceName"); 
QString name1 = obj.objectName();   // return instanceName
//每个对象还可以通过它的元对象className方法得到类的名字
QString name2 = obj.metaObject()->className();  // return FirtstQtApp

//每个对象可以通过QObject::inherits方法来查询是否派生于某类

bool isherited =  obj.inherits("QObject");         // returns true
isherited =  obj.inherits("QWideget");         // returns true

让我们再来一下QObject::inherits方法的底层实现:

inline bool inherits(const char *classname) const
	{ return const_cast<QObject *>(this)->qt_metacast(classname) != 0; } 

原来,QObject::inherits是通过qt_metacast()这个虚函数实现的, 事实上每个QObject的派生类都必须实现metaObject()以及其他qt_metacall()方法,从而满足自省方法className, inherits等方法的调用(当然还有其他用途)。

而所有有关派生从QObject的子类中的内省方法无须有用户实现,用户只要在类中声明宏Q_OBJECT即可,Qt的元对象编译器(moc)负责实现派生从QObject的子类中的内省方法。

#define Q_OBJECT /
public: /  
    Q_OBJECT_CHECK /  
static const QMetaObject staticMetaObject; /  
    Q_OBJECT_GETSTATICMETAOBJECT /  
virtual const QMetaObject *metaObject() const; /  
virtual void *qt_metacast(const char *); /  
    QT_TR_FUNCTIONS /  
virtual int qt_metacall(QMetaObject::Call, int, void **); /

此外,所有的Qt widgets类均继承自QObject, QObject所提供的isWidgetType自省方法可以很方便让QObject子对象查询自己是否是wideget, 而且它会比 qobject_cast<QWidget *>(obj) 或者 obj->inherits快很多。原因qobject_cast()t和inherits()都是借助元对象系统来实现其功能的,isWidgetType()是QObject本身的标志位得以实现。

更多自省方法定义在QMetaObject,以下是QMetaObject声明的源代码:

struct Q_CORE_EXPORT QMetaObject  
{  
const char *className() const;  
const QMetaObject *superClass() const;  
    QObject *cast(QObject *obj) const;  
    ....  
int methodOffset() const;  
int enumeratorOffset() const;  
int propertyOffset() const;  
int classInfoOffset() const;  
int constructorCount() const;  
int methodCount() const;  
int enumeratorCount() const;  
int propertyCount() const;  
int classInfoCount() const;  
int indexOfConstructor(const char *constructor) const;  
int indexOfMethod(const char *method) const;  
int indexOfSignal(const char *signal) const;  
int indexOfSlot(const char *slot) const;  
int indexOfEnumerator(const char *name) const;  
int indexOfProperty(const char *name) const;  
int indexOfClassInfo(const char *name) const;  
    ...  
} 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Qt QObject 是 Qt 库中的一个基础类。它是所有 Qt 对象的基类,提供了许多基本的对象管理功能,包括内存管理、事件通信、信号和槽机制以及属性系统。 使用 QObject 的子类可以很容易地在应用程序中实现事件驱动的行为,并且可以利用 Qt 的信号和槽机制在对象之间进行通信。 例如,可以使用 QObject::connect 函数来连接一个对象的信号到另一个对象的槽函数,从而在信号发出时调用槽函数。这种机制可以让你很容易地在应用程序中实现事件驱动的行为,并且可以使用 Qt 的信号和槽机制在对象之间进行通信。 ### 回答2: Qt是一种跨平台的C++开发框架,用于构建图形界面和应用程序。QObject是Qt框架中的一个核心类,用于实现对象的即时信号和槽机制。 QObject提供了各种功能,例如对象的属性系统、线程支持、对象的生命周期管理等。在Qt中,所有类都继承自QObject或者其子类,以获得这些功能。 QObject的一个重要特性是信号和槽机制。信号和槽机制是一种对象间通信的方式,通过信号实现对象的某个事件的触发,然后通过槽函数来处理事件。信号和槽机制可以实现耦合度低、灵活性高的对象间通信,非常方便。 此外,QObject还有一个属性系统,用于管理对象的属性。属性可以是对象的状态或配置信息,可以通过属性系统实现对属性的读取和修改。属性系统提供了一种方便的方式来处理对象的状态变化或界面显示问题。 另外,QObject提供了对对象生命周期的管理。Qt中的对象可以是直接由new操作符动态创建的,也可以是作为父对象的子对象。当父对象删除时,它会自动删除其所有子对象,以避免内存泄漏问题。 总而言之,QObject是Qt框架中非常重要的一个类,提供了诸多功能,例如信号和槽机制、属性系统、对象生命周期管理等。它使得Qt开发更加方便和高效,极大地简化了开发人员的工作。 ### 回答3: Qt中的QObject是一个基类,用于构建具有对象管理和信号槽机制的应用程序。 QObject提供了一些重要的特性,使得Qt应用程序开发更加方便和灵活。首先,QObject提供了对象树的构造和管理能力。通过将QObject对象组织成树状结构,可以轻松地管理应用程序中的对象,包括对象的创建、销毁和层次关系等。这种对象树的管理机制使得QObject更适合构建大型复杂的应用程序。 QObject还提供了信号槽机制,用于实现对象之间的通信和交互。信号槽机制基于事件驱动的方式,当对象的某个状态发生变化或者执行某个操作时,会发出一个信号。其他对象可以通过连接到这个信号的槽函数来接收和处理这个信号。这种松耦合的通信方式使得应用程序的组件之间能够相互独立,易于维护和扩展。 QObject还提供了一些其他功能,包括动态属性的支持、线程安全的信号槽连接、对象的元对象信息等。动态属性功能允许在运行时为QObject对象添加自定义的属性,并且可以通过属性更改通知信号和属性读写方法进行访问。线程安全的信号槽连接确保多线程环境下信号槽的安全性和正确性。元对象信息允许在运行时获取对象的类型信息,包括类名、成员变量、方法等。 总之,Qt中的QObject是一个重要的基类,提供了对象管理和信号槽机制等核心功能,使得Qt应用程序开发更加简洁、灵活和可维护。它的使用可以大大提高应用程序的开发效率和代码质量。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值