怎么释放ui页面所占的内存

weixin_38060336 2019-09-19 01:15:25
class Mapview :public QWidget{    Q_OBJECTpublic:    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_OBJECTpublic:     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吗?我错在哪里呢?
...全文
169 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38103419 2019-09-19
  • 打赏
  • 举报
回复
在我们的平台上6%,意味着2.7MB呢,总共才32M,系统还要用掉十几兆
weixin_38104003 2019-09-19
  • 打赏
  • 举报
回复
楼主对ui文件生成代码或类这个机制理解的不够清晰。我们可以看一下ui_xxx.h文件,其中的setupUi(this )这个玩意是一个内联函数,内联函数的作用也就是提供了这么一片代码。当我们在自定义的widget里面调用的时候,内联函数将在调用处展开,ui中所有部件的父部件实际上就是你当前这个类。所以你就算delete m_ui也没有任何效果,因为人家这个类本质上就是为你提供了这么一堆代码,基本没有占用你的任何内存,ui设计的所有父部件也不是你的ui设计的这个类的对象,而是当前类的对象。内存占用大的问题我没有研究,但我们看看ui_xx.h这个文件会发现,里面有太多冗余的代码,比如我们设置一个背景调色板,生成的不止一行代码,还有设置对象的名称的一堆代码,还有提供翻译的函数等等,实质上都有些冗余。如果想提高效率,不妨把我们的xx.ui文件删掉,然后再专心修改一下ui_xx.h这个文件,去除一些冗余的代码。当然,很多的控件本身要显示出来肯定要占用内存的,这个我们没法规避。除非采用新的部件,或者自定义的部件。
weixin_38113326 2019-09-19
  • 打赏
  • 举报
回复
楼上强大,同意帮顶
weixin_38113386 2019-09-19
  • 打赏
  • 举报
回复
引用第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);}请大家帮忙解答一下,谢谢啦!
weixin_38118871 2019-09-19
  • 打赏
  • 举报
回复
up!up!help!help!
weixin_38067109 2019-09-19
  • 打赏
  • 举报
回复
up!up!高手解答一下啊!
weixin_38067693 2019-09-19
  • 打赏
  • 举报
回复
我就是瞎问问;;;好几百KB的内存确实是m_mappage所占吗?m_mappage有show出来吗?如果show出来的话确定它是被destroy掉的才好~~~Mark 帮顶~~~
weixin_38076910 2019-09-19
  • 打赏
  • 举报
回复
我测试了m_mappage和m_guidepage在setupUI的时候,内存都上升了2%,show出来,显示在屏幕上以后,还会上升1%。这样一来,两个页面就上升6%了。
weixin_38079044 2019-09-19
  • 打赏
  • 举报
回复
内存都上升了2%。。。这个。。。还以为是下板子占内存什么的。。。program运行当然CUP up啦~~~这个数据的精度不说,这个测试我不知道有什么太大的意义。。。OVER~~~

433

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧