当前位置: 首页 > news >正文

Qt窗体自动销毁

Qt中通过对象树的方式,实现了窗体自动析构,只要我们使用得当,就能免去自己去释放窗体对象的内存,但是我们得清楚Qt窗体自动析构的机制,什么情况下能够自动析构,什么情况不能。操作不当的情况可能造成内存泄漏,甚至会出现程序崩溃问题。

下面通过一系列示例进行探究。

设置父窗体

这种情况规则最简单,在创建窗体或控件时,指定其parent对象,当parent对象销毁时,则会析构该窗体。

QComboBox* cbx=new QComboBox(this);//this窗体被析构时,cbx自动析构

Qt中如果一个widget创建时没有指定parent,但是被其他窗体设置为centerWidget()后
其他窗体析构时,该窗体能正常析构

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{MyWidget* w=new MyWidget();//MainWindow将成为w的父窗体this->setCentralWidget(w);
}
设置窗体关闭时自动销毁

Qt中如果一个widget没有指定parent,但设置setAttribute(Qt::WA_DeleteOnClose);
该窗口关闭时析构

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//w作为一个独立的窗体展示,点击关闭按钮后,窗体自动析构MyWidget* w=new MyWidget();w->show();w->setAttribute(Qt::WA_DeleteOnClose);
//    this->setCentralWidget(w);
}

Qt中如果一个widget没有指定parent,且没有设置setAttribute(Qt::WA_DeleteOnClose);
该窗口关闭时不会析构,主窗口关闭后,该窗口也不会析构

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//w作为一个独立的窗体展示,关闭后,并不会销毁MyWidget* w=new MyWidget();w->show();
}
放入父窗体的布局之中

如果一个控件在new时没有指定parent,但是放在了一个另窗体的布局中,该窗体关闭时
该控件将析构。将控件放入一个窗体的布局中时,将自动设置该窗体为控件的父窗体。
 

MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{MyLineEdit* edit=new MyLineEdit();//没有指定parentQVBoxLayout* layout=new QVBoxLayout();layout->addWidget(edit);//放在一个widget的布局中this->setLayout(layout);//当放入到当前窗体的布局中时,当前窗体将成为edit的父窗体
}
指定父窗体,又放入布局

Qt中,如果一个控件指定了widget1作为parent,但是又放在了widget2的布局中
在widget2被析构的时候,该控件将被析构
 

MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{MyLineEdit* edit=new MyLineEdit(parent);//指定widget1作为parentQVBoxLayout* layout=new QVBoxLayout();layout->addWidget(edit);//edit的实际parent已经更改为widget2( this, MyWidget*)this->setLayout(layout);
}

其他设置父窗体的场景
控件放入表格中

Qt中,将一个编辑框放置在一个表格中,当表格被析构的时候,编辑框也被析构

MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{MyLineEdit* edit=new MyLineEdit(parent);QTableWidget* table=new QTableWidget(this);table->setColumnCount(2);table->setRowCount(2);table->setCellWidget(0,0,edit);//表格table析构时,edit也被析构QVBoxLayout* layout=new QVBoxLayout();layout->addWidget(table);this->setLayout(layout);}

http://www.lryc.cn/news/220910.html

相关文章:

  • 制造业企业设备管理常见的三个问题及对应的解决方案
  • linux文件目录
  • 流量卡是什么?流量卡为什么有虚量,51物联卡带你全面了解一下。
  • 浅谈电力物联网时代物联网技术在电力系统中的应用
  • HTTP 状态代码 (Winhttp.h)
  • 开槌在即:陈可之油画|《赞红梅》
  • C++内存分配 new 和 delete
  • 蓝桥云课--1014 第 1 场算法双周赛
  • 管理类联考——写作——技巧篇——书写标点符号使用要求规范文档
  • 快速解决mfc140u.dll丢失问题,找不到mfc140u.dll修复方法分享
  • 福建地区等保测评怎么做
  • mysql数据库的备份和恢复
  • 动态IP和静态IP哪个安全,该怎么选择
  • linux复习笔记03(小滴课堂)
  • webgoat-Broken Access ControlI 访问控制失效
  • Beaustiful Soup爬虫案例
  • 【Redis】Redis与SSM整合Redis注解式缓存Redis解决缓存问题
  • 谈一谈SQLite、MySQL、PostgreSQL三大数据库
  • 【微软技术栈】C#.NET 中的本地化
  • 【qemu逃逸】华为云2021-qemu_zzz
  • vue递归获取树形菜单
  • [ubuntu]ubuntu22.04默认源和国内源
  • Map和ForEach的区别,For in和For of的区别
  • json字符串属性名与实体类字段名转换
  • Vue Vuex模块化编码
  • 消费者忠诚度研究:群狼调研帮您制定忠诚客户计划
  • 接口幂等性详解
  • Java操作redis常见类型数据存储
  • 【深度学习】pytorch——Autograd
  • 【ARM 安全系列介绍 1 -- 奇偶校验与海明码校验详细介绍】