出现问题的做法:
最近使用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) |