1.如何管理从堆中new出的QObject对象?如何安全delete才能避免内存泄露?
这个问题看起来很愚蠢,new出QObject,不用时delete了,不就行了,怎么会有这种问题呢? 问题就在于"不用时"难以确定.
QT是一个图形平台系统,有些时候,对象之间的逻辑关系比较复杂,用户可能找不到合适的时机delete或者需要写额外的代码来delete。为此,QT提供了一些机制,来帮助你管理对象的生命周期,在合适的时候帮助你delete。
(1)利用对象树object_trees管理对象
先看一下,QObject的构造函数
QObject的类构造函数的第一个参数也是一个QObject.如下:
QObject( QObject *parent=0, const char *name=0 );
第一个参数实际上为QObject指定个父对象。QT中所有parent=0的对象形成一个双向链表object_trees,每个parent=0的对象及其所有子对象也形成一棵树,parent=0的对象是树根,其它子对象/孙子对象挂在这个树上. 当父对象删除时,QT会遍历其子对象并删除. 所以最好为每个子对象指定一个父对象,这样只要记得删除这个父对象就可以了。当然对于没有父对象的QT对象,就需要手工写代码删除。
这个方法适用于所有QObject对象及其子类对象。
(2)利用WDestructiveClose属性
先看一下,QWidget的构造函数
QWidget( QWidget* parent=0, const char* name=0, WFlags f=0 );
利用最后一个参数WFlags f可以指定WDestructiveClose属性,当调用QWidget::close关闭时,QWidget::close里会检查是否有WDestructiveClose属性,如果有就是主动delete这个对象。
这个方法仅适用于QWidget对象及其子对象
2.widget和window之间有什么区别?
在QT/E的代码会出现window这个名词,window一般是指topLevelWidget。
3.什么是topLevelWidget?
答案很简单,就是具有WType_TopLevel属性的widget。对于这个属性用户也可以直接用QWidget::setWFlags()来设置,但是除非用户明白想做什么,否则不要做。因为QWidget::setWFlags只是改了一下值,并没有做其它调整。
有些的widget会有WType_TopLevel:
(1)在构造函数中指定WType_TopLevel WType_Dialog WType_Popup WType_Desktop
(2)在构造函数中指定parentWidget=0
4.topLevelWidget和普通的widget有什么区别?
(1)topLevelWidget->parenWidget()=0
(2)topLevelWidget->winId()>0
topLevelWidget在调用show后,QWS server会记录这个widget,并分配一个大于0的winId.对于普通的widget, QWS Server是不管理的,也不知道其存在,其winId是负值。
(3)topLevelWidget在调用show后,QWS Server会分配屏幕区域给topLevelWidget。普通的widget的有parentWidget,是从其parenWidget分配屏幕区域,因此在QT Embedded中,普通的widget是由其parentWidget管理的。
(4)对应于Win32/MFC中的概念,topLevelWidget就是具有WS_OVERLAPPEDWINDOW或WS_POPUPWINDOW属性的window(有title,border),普通的widget就是control或child window。
5.什么是activewindow?
QWS Server会记录所有的topLevelWidget,,在这些topLevelWidget中,在一个时刻只有一个是activeWindow,QWS Client收到QWS Server发来的key event后,会把key event再发给activewindow->focusWidget()。
阅读(702) | 评论(0) | 转发(0) |