Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3151
  • 博文数量: 2
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 30
  • 用 户 组: 普通用户
  • 注册时间: 2015-06-09 12:36
个人简介

zzZZZ zzZZZ zzZZZ

文章分类

全部博文(2)

文章存档

2015年(2)

我的朋友

分类: C/C++

2015-06-09 13:18:50

    出现问题的做法:
    最近使用Qt做个应用程序,希望把框架和业务分开来做,就把业务相关的界面放到插件(CPlugin类)里面,通过管理类(CFilterWidgetManager类)来对某个QTabWidget容器增加和移除子页面,CFilterWidgetManager类是一个单件类,功能实现方法如下:
    1. 插件初始化(Initialise)时,,创建QWidget对象mFilterWidget,调用管理类CFilterWidgetManager::getInstance()->addWidget(mFilterWidget);将该页面增加到CFilterWidgetManager的列表中。
    2. 插件释放(Release)时,调用管理类CFilterWidgetManager::getInstance()->removeWidget(mFilterWidget);将mFilterWidget页面从管理类的列表中移除,然后,删除mFilterWidget对象
    3. CFilterWidgetManager管理类attachContainerWidget(QTabWidget*)时,将页面列表增加到QTabWidget子页面中。
    4. 
CFilterWidgetManager管理类attachContainerWidget(QTabWidget*)切换到其他QTabWidget,先将前一个QTabWidget的子页面移除,在将这些子页面增加到其他页面之下。


    本来以为这样很简单就可以实现想要的功能了,实际上却行不通。因为使用QTabWidget作为容器,在调用QTabWidget::removeTab()函数时,已经将mFilterWidget对象delete了,所以mFilterWidget指针成了一个野指针。并且QTabWidget没有提供类似于,takeTab()之类的函数,不delete对象,同时将该对象从子页面移除。如果想要把这个页面放到不同的QTabWidget下就行不通了。

    修改后的方法:
    1. 修改为将页面定义为反射类(ReflectObject),插件初始化时,CFilterWidgetManager记录类名,增加到列表中。
    2. CFilterWidgetManager管理类attachContainerWidget(QTabWidget*)时,通过反射创建各个页面并增加到QTabWidget的页面中。

    这样问题算是解决了。不过Qt为什么不提供一个 QWidget* QTabWidget::takeTab(int idx); 函数呢?。这里作个笔记,等找到更好方法时更新。
阅读(1079) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:我的开发备忘录 -- Ice中间件学习笔记(1)

给主人留下些什么吧!~~