【Qt入门实践】QObject使用总结

来源:互联网 发布:穆雅斓的淘宝店斌斌 编辑:程序博客网 时间:2024/05/17 03:15

QObject

QObject是Qt所有对象的基类,是Qt对象模型(QtObject Model)的核心。Qt对象模型的主要特性是一个能让对象间无缝交流的强大机制:信号和槽。你可以使用connect()方法连接一个信号和槽,也可以使用disconnect()方法断开这个连接。

 

QObjects用对象树来组织它们自己。当你创建一个QObject,并且将另一个对象设置为它的parent的时候,这个对象会自动的把它自己加到parent对象的children列表中。Parent持有这个对象的所有权,也就是说,当parent释放的时候会自动把children都释放掉。你可以使用findChild()方法或者findChildren()方法去查找一个对象,区别是一个是返回单个对象,一个是返回对象列表。

 

每个对象都有对象名称(objectName()),它的类名可以通过metaObject()得到,你还可以通过调用inherits()方法判断对象的类是否派生至另一个类。

 

当一个对象被删除的时候,它会发送一个destroyed()信号,你可以截获这个信号去做些自己的处理。比如,防止悬挂指针的出现。

 

QObjects可以通过event()方法接收事件,并且可以通过installEventFilter()和evnetFilter()过滤其他对象的事件,也可以通过实现childEvent()来截获子对象的事件。

 

QObject还提供了基础定时器的支持,可以使用startTimer()来启动定时器,重新实现timerEvent()函数来响应定时器的处理。如果你想使用更高级的定时器的话,就需要使用QTimer对象。

 

有一点需要注意的是,Q_OBJECT宏对于所有需要使用信号、槽或属性机制的对象都是必须。建议大家对于所有派生至QObject的类都加上Q_OBJECT宏,不管你是否需要信号、槽、属性机制,因为如果缺少这个宏,有些QObject函数可能会出现未定义的行为。

 

QObject被设计为没有复制构造函数和赋值操作符,实际上在QObject里声明了,但是都是私用的并且空实现,所以使用不了。这是通过使用宏Q_DISABLE_COPY()来实现的。实际上,所有派生至QObject的类都应该使用这个宏来屏蔽复制构造函数和赋值操作符。QObject被认为不应该提供复制操作是基于以下考虑:

1.      每个QObject都有一个objectName,复制后的对象名称应该是什么?

2.      每个QObject在对象树中都有自己的位置,复制后的对象应该放在哪个位置?

3.      QObject对象可以通过信号槽和其他对象链接起来,复制后的对象怎么处理链接关系?

4.      QObject属性可以在运行期动态添加,复制后的对象是否也需要添加这些属性?

这些问题我们都很难回答,所以我们应该把QObject当做identities对待,而不是values。Identities只能clone不能copy或assign,clone一个identity比copy和assign复杂多了。因此,QObject所有子类都应该屏蔽复制构造函数和赋值操作符。


0 0
原创粉丝点击