Chinaunix首页 | 论坛 | 博客
  • 博客访问: 57639
  • 博文数量: 18
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 220
  • 用 户 组: 普通用户
  • 注册时间: 2009-02-09 21:53
文章分类
文章存档

2011年(1)

2009年(17)

我的朋友

分类: LINUX

2009-02-11 00:23:44

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()。
阅读(1464) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~