• 6251阅读
  • 9回复

怎么释放ui页面所占的内存 [复制链接]

上一主题 下一主题
离线yxhappy
 
只看楼主 倒序阅读 楼主  发表于: 2009-12-23
class Mapview :public QWidget
{
    Q_OBJECT
public:
    Mapview( QWidget *parent = 0, Qt::WFlags flags = 0);
    Ui::mapviewclass mapview_ui;    //由Qt Designer做的ui文件自动生成的ui类对象,也就是一个ui页面
};
Mapview::Mapview(  QWidget *parent, Qt::WFlags flags)
:QWidget(parent,flags)
{
    mapview_ui.setupUi(this);
}
class NSMapCanvas : public QWidget
{
    Q_OBJECT
public:
     Mapview *m_mappage;
    QVBoxLayout *layout;
}
NSMapCanvas::NSMapCanvas( QWidget *parent , Qt::WFlags flags  )
:QWidget( parent, flags)
{
    layout = new QVBoxLayout;
    layout->setContentsMargins( 0,0,0,0);
    m_mappage = new Mapview();
    layout->addWidget(m_mappage);
    setLayout(layout);
}
请问我要怎么做才能释放掉这个ui文件所占用的内存呢?我测试了一下,一个ui文件占了好几百KB的内存,这个wince可受不了啊。我用delete m_mappage,不起作用呀,不是说删除父widget就可以了吗?m_mappage不就是整个ui的父widget吗?我错在哪里呢?
离线yxhappy
只看该作者 1楼 发表于: 2009-12-23
up!up!高手解答一下啊!
离线yangfanxing
只看该作者 2楼 发表于: 2009-12-23
我就是瞎问问;;;
好几百KB的内存确实是m_mappage所占吗?
m_mappage有show出来吗?
如果show出来的话确定它是被destroy掉的才好~~~

Mark 帮顶~~~
PHPWind好恶心。。。不想看这种界面。。。
离线yxhappy
只看该作者 3楼 发表于: 2009-12-23
我测试了m_mappage和m_guidepage在setupUI的时候,内存都上升了2%,show出来,显示在屏幕上以后,还会上升1%。这样一来,两个页面就上升6%了。
离线yangfanxing
只看该作者 4楼 发表于: 2009-12-23
内存都上升了2%。。。

这个。。。还以为是下板子占内存什么的。。。

program运行当然CUP up啦~~~

这个数据的精度不说,
这个测试我不知道有什么太大的意义。。。

OVER~~~
PHPWind好恶心。。。不想看这种界面。。。
离线yxhappy
只看该作者 5楼 发表于: 2009-12-23
在我们的平台上6%,意味着2.7MB呢,总共才32M,系统还要用掉十几兆
离线318065268
只看该作者 6楼 发表于: 2009-12-23
楼主对ui文件生成代码或类这个机制理解的不够清晰。

我们可以看一下ui_xxx.h文件,其中的setupUi(this )这个玩意是一个内联函数,内联函数的作用也就是提供了这么一片代码。当我们在自定义的widget里面调用的时候,内联函数将在调用处展开,ui中所有部件的父部件实际上就是你当前这个类。所以你就算delete m_ui也没有任何效果,因为人家这个类本质上就是为你提供了这么一堆代码,基本没有占用你的任何内存,ui设计的所有父部件也不是你的ui设计的这个类的对象,而是当前类的对象。

内存占用大的问题我没有研究,但我们看看ui_xx.h这个文件会发现,里面有太多冗余的代码,比如我们设置一个背景调色板,生成的不止一行代码,还有设置对象的名称的一堆代码,还有提供翻译的函数等等,实质上都有些冗余。如果想提高效率,不妨把我们的xx.ui文件删掉,然后再专心修改一下ui_xx.h这个文件,去除一些冗余的代码。
当然,很多的控件本身要显示出来肯定要占用内存的,这个我们没法规避。除非采用新的部件,或者自定义的部件。
Email  rsail@126.com(私人邮箱)
QQ:   318065268
离线benbenmajia

只看该作者 7楼 发表于: 2009-12-23
楼上强大,同意帮顶
安然.....
离线yxhappy
只看该作者 8楼 发表于: 2009-12-24
引用第6楼318065268于2009-12-23 15:26发表的  :
楼主对ui文件生成代码或类这个机制理解的不够清晰。
我们可以看一下ui_xxx.h文件,其中的setupUi(this )这个玩意是一个内联函数,内联函数的作用也就是提供了这么一片代码。当我们在自定义的widget里面调用的时候,内联函数将在调用处展开,ui中所有部件的父部件实际上就是你当前这个类。所以你就算delete m_ui也没有任何效果,因为人家这个类本质上就是为你提供了这么一堆代码,基本没有占用你的任何内存,ui设计的所有父部件也不是你的ui设计的这个类的对象,而是当前类的对象。
内存占用大的问题我没有研究,但我们看看ui_xx.h这个文件会发现,里面有太多冗余的代码,比如我们设置一个背景调色板,生成的不止一行代码,还有设置对象的名称的一堆代码,还有提供翻译的函数等等,实质上都有些冗余。如果想提高效率,不妨把我们的xx.ui文件删掉,然后再专心修改一下ui_xx.h这个文件,去除一些冗余的代码。
.......


不好意思,我还有几个地方不明白
Mapview::Mapview(  QWidget *parent, Qt::WFlags flags)
:QWidget(parent,flags)
{
    mapview_ui.setupUi(this);
}
mapview_ui的父对象不是Mapview对象吗?那我在NSMapCanvas类里delete m_mappage(Mapview *m_mappage)不能释放这个页面控件所占用内存吗?我是想删除ui页面那些控件所占用的内存。
NSMapCanvas::NSMapCanvas( QWidget *parent , Qt::WFlags flags  )
:QWidget( parent, flags)
{
    layout = new QVBoxLayout;
    layout->setContentsMargins( 0,0,0,0);
    m_mappage = new Mapview();//mapview_ui的父Widget不是m_mappage对象吗?如果不能通过delete m_mappage来释放所占用的内存,那我改用什么办法呢?
    layout->addWidget(m_mappage);
    setLayout(layout);
}
请大家帮忙解答一下,谢谢啦!
离线yxhappy
只看该作者 9楼 发表于: 2009-12-25
up!up!
help!help!
快速回复
限100 字节
 
上一个 下一个