Qt工作笔记-通过 对象树 或 delete this 释放对象
目录
背景
实例
背景
今天在写代码的时候,new出的界面,没有delete,因为是dialog,可以用exec() 把后面的界面阻塞掉,但个人并不喜欢这样,毕竟觉得强扭的瓜不甜!不想让后面的那个界面为了xxx而改变自己,所以在此,想用其他方法!Qt中一个局部对象,如何通过不在此函数中delete也能释放!
经过思考与实践发现有2个方法:
1. 是使用Qt对象树,这应该是Qt上很常见的方法;
2. 是 delete this
实例
方法一:使用Qt的对象树释放!
当主界面被关闭后,会把对象树上的释放掉!
程序结构如下:
源码如下:
testdialog.h
#ifndef TESTDIALOG_H
#define TESTDIALOG_H#include <QDialog>namespace Ui {
class TestDialog;
}class TestDialog : public QDialog
{Q_OBJECTpublic:explicit TestDialog(QWidget *parent = 0);~TestDialog();protected slots:void btnClicked();protected:void closeEvent(QCloseEvent *event) Q_DECL_OVERRIDE;private:Ui::TestDialog *ui;
};#endif // TESTDIALOG_H
widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();protected slots:void btnClicke();private:Ui::Widget *ui;
};#endif // WIDGET_H
main.cpp
#include "widget.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}
testdialog.cpp
#include "testdialog.h"
#include "ui_testdialog.h"#include <QMessageBox>TestDialog::TestDialog(QWidget *parent) :QDialog(parent),ui(new Ui::TestDialog)
{ui->setupUi(this);connect(ui->pushButton, SIGNAL(clicked(bool)), this, SLOT(btnClicked()));
}TestDialog::~TestDialog()
{delete ui;QMessageBox::information(this, "提示", "TestDialog中的析构函数被调用");
}void TestDialog::btnClicked()
{//this->close();//delete this;
}void TestDialog::closeEvent(QCloseEvent *event)
{Q_UNUSED(event)btnClicked();
}
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include "testdialog.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);connect(ui->pushButton, SIGNAL(clicked(bool)), this, SLOT(btnClicke()));
}Widget::~Widget()
{delete ui;
}void Widget::btnClicke()
{TestDialog *testDialog = new TestDialog(this);testDialog->show();//不释放,看看能不能析构
}
testdialog.ui
widget.ui
第二种方法是delete this
把testdialog.cpp中btnclicked中的那两行注释去掉就可以了!
上面的这种只是一个例子,很脆弱,没有考虑在栈区创建的对象!
Qt工作笔记-通过 对象树 或 delete this 释放对象相关推荐
- Qt工作笔记-发送端发送Json格式的数据包,接收端解析数据包
原理以及运行 原理是因为QJsonDocument提供了一个函数toJson 可以直接把Json数据转成QByteArray,这样就可以直接发送数据包,然后再按照常规方法解析即可,本源码中含解析内容, ...
- Qt工作笔记-Qt元对象系统解析【2合1】
博文转载地址: https://blog.csdn.net/spwper/article/details/51332187 说Qt信号与槽是一个很好机制,不如说Qt的元对象系统很强大.这也是大家讲Qt ...
- Qt工作笔记-QML界面与QWidgets界面相互交互
C++要做的事情: 1.QML中注册C++类型(qmlRegisterType) 2.获取元对象树,从中提取注册的指针[这样就和普通的对象一样了] qml要做的事情: 1.import注册的C++类型 ...
- Qt工作笔记-MineData相关基本操作
QMimeData类提为数据提供一个容器,用来记录关于MIME类型数据的信息 QMimeData常用来描述保存在剪切板里信息,或者拖拽原理 QMimeData对象把它所保存的信息和正确的MIME类型连 ...
- C/C++|Qt工作笔记-4种方法判断当前对象(类)名或标识(继承发,typeid法,元对象className()法,Q_CLASSINFO法)
回想起3个月前,刚刚参加工作也做过类似的笔记,但只有2种方法,估计刚毕业没有什么墨水,经过3个月时间又多了2种方法: 这些方法都可用于RTTI 第一个方法是继承发(C++中很推荐用这个,感觉用这个结构 ...
- Qt工作笔记-对QThread使用的进一步认识(exec及对象在哪个线程创建)
目录 基本概念 代码与实例 基本概念 这里有个官方例子,如下: class WorkerThread : public QThread{Q_OBJECTvoid run() override {QSt ...
- Qt工作笔记-通过C++使widgets与QQuick交互(包含qml界面对象与C++对象映射)
目录 理论及程序运行 源码 理论及程序运行 这里要注意,通过qmlRegisterType函数去注册一个QML类! 下面再指明一个关键的问题,如何把QML界面的对象映射到C++呢! 可以有如下的处理: ...
- Qt文档阅读笔记-Qt工作笔记-QThread解析与实例(主线程发送信号给子线程)
目录 QThread 官方解析 博主栗子 子线程发射信号给主线程 QThread 官方解析 Detailed Description QThread类提供了跨平台的线程管理的API. QThread对 ...
- Qt工作笔记-对*QObject::sender()的认识
今天有个大佬给我说了这个函数: [protected] QObject *QObject::sender() const 简直阔怕: 感觉这个函数有点歪门邪道! 这里有个多线程中的警告,Qt::Dir ...
最新文章
- 入门架构——单机高性能
- unix 存储空间不足 无法处理此命令_大数据分析命令行使用教程
- LeetCode面试题03. 数组中重复的数字
- 自定义Visual Studio.net Extensions 开发符合ABP vnext框架代码生成插件[附源码]
- 【C++深度剖析教程14】经典问题解析三之关于赋值的疑问
- 永远年轻,永远热泪盈眶----致所有奋斗的ACMer
- 机器学习笔记(七)——决策树模型
- 1000个摄像头的网络怎么搭建?为什么500个就卡的不行?
- 是谁榨干了 Android 设备的电量和流量?!| 极客头条
- 1.1zookeeper简介
- C语言实例第9期:提取字符串中全部数字
- Weka的全名是怀卡托智能分析环境
- 合唱队形(最大上升子序列)
- 阿里云国际版跨境加速,全球加速和Squid 缓存代理解决方案
- PHP+python+nodejs+ springboot+vue 社区互助平台
- LeetCode 881.救生艇
- 使用FFMpeg将音频PCM数据生成WAV和MP3文件
- Curl运维命令 - 日常用法总结
- linux vi或者vim编辑器中如何显示行号
- 微信小程序获取昵称,头像