【1】close 与 Qt::WA_DeleteOnClose简介

1.1 Qt源码

 /*!
Closes this widget. Returns \c true if the widget was closed;
otherwise returns \c false. First it sends the widget a QCloseEvent. The widget is
\l{hide()}{hidden} if it \l{QCloseEvent::accept()}{accepts}
the close event. If it \l{QCloseEvent::ignore()}{ignores}
the event, nothing happens. The default
implementation of QWidget::closeEvent() accepts the close event. If the widget has the Qt::WA_DeleteOnClose flag, the widget
is also deleted. A close events is delivered to the widget no
matter if the widget is visible or not. The \l QApplication::lastWindowClosed() signal is emitted when the
last visible primary window (i.e. window with no parent) with the
Qt::WA_QuitOnClose attribute set is closed. By default this
attribute is set for all widgets except transient windows such as
splash screens, tool windows, and popup menus. */ bool QWidget::close()
{
return d_func()->close_helper(QWidgetPrivate::CloseWithEvent);
} /*!
This event handler is called with the given \a event when Qt receives a window
close request for a top-level widget from the window system. By default, the event is accepted and the widget is closed. You can reimplement
this function to change the way the widget responds to window close requests.
For example, you can prevent the window from closing by calling \l{QEvent::}{ignore()}
on all events. Main window applications typically use reimplementations of this function to check
whether the user's work has been saved and ask for permission before closing.
For example, the \l{Application Example} uses a helper function to determine whether
or not to close the window: \snippet mainwindows/application/mainwindow.cpp 3
\snippet mainwindows/application/mainwindow.cpp 4 \sa event(), hide(), close(), QCloseEvent, {Application Example}
*/ void QWidget::closeEvent(QCloseEvent *event)
{
event->accept();
}

1.2 公共槽函数

1.3 帮助文档

1.4 Qt::WA_DeleteOnClose

【2】实例代码

1.1 TWidget.h

 #ifndef TWIDGET_H
#define TWIDGET_H #include <QWidget>
#include <QDebug> namespace Ui
{
class TWidget;
} class MyWidget : public QWidget
{
public:
MyWidget(QWidget *parent = NULL);
~MyWidget();
}; class TWidget : public QWidget
{
Q_OBJECT public:
explicit TWidget(QWidget *parent = );
~TWidget(); private slots:
void onPushButtonPressed(); private:
Ui::TWidget *m_pUI;
MyWidget *m_pMyWidget;
}; #endif // TWIDGET_H

1.2 TWidget.cpp

 #include "TWidget.h"
#include "ui_TWidget.h" MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
{
qDebug() << "construct :: MyWidget";
} MyWidget::~MyWidget()
{
qDebug() << "destruct :: ~MyWidget";
} TWidget::TWidget(QWidget *parent)
: QWidget(parent)
, m_pUI(new Ui::TWidget)
, m_pMyWidget(NULL)
{
m_pUI->setupUi(this); m_pMyWidget = new MyWidget();
m_pMyWidget->setFixedSize(, );
m_pMyWidget->setAttribute(Qt::WA_DeleteOnClose); // 设置属性Qt::WA_DeleteOnClose connect(m_pUI->pushButton, &QPushButton::pressed, this, &TWidget::onPushButtonPressed);
} TWidget::~TWidget()
{
if (m_pUI != NULL)
{
delete m_pUI;
m_pUI = NULL;
} if (m_pMyWidget != NULL)
{
delete m_pMyWidget;
m_pMyWidget = NULL;
}
} void TWidget::onPushButtonPressed()
{
if (m_pMyWidget != NULL)
{
m_pMyWidget->show();
}
}

1.3 main.cpp

 #include "TWidget.h"
#include <QApplication> int main(int argc, char *argv[])
{
QApplication a(argc, argv); TWidget w;
w.show(); return a.exec();
}

1.4 TWidget.ui 界面(UI很简单,仅仅为了验证问题,只放置了一个PushButton)

1.5 运行结果:

注意观察,现象如下:

第一次点击 pushButton 按钮,对话框弹出,关闭对话框。打印日志如下:

 construct :: MyWidget
destruct :: ~MyWidget

第二次点击 pushButton 按钮,程序崩溃。

1.6 注释掉设置属性行(即TWidget.cpp 第24行),再编译、运行、一切正常。

【3】总结

如果设置窗体的Qt::WA_DeleteOnClose属性:调用close方法时,窗体将被析构掉。

Good Good Study, Day Day Up.

顺序 选择 循环 总结

QWidget 的 close 与 Qt::WA_DeleteOnClose的更多相关文章

  1. Qt浅谈之一:内存泄露(总结),对于QWidget可以setAttribute(Qt::WA_DeleteOnClose),而且绝对不能手动删除栈上的对象

    一.简介 Qt内存管理机制:Qt 在内部能够维护对象的层次结构.对于可视元素,这种层次结构就是子组件与父组件的关系:对于非可视元素,则是一个对象与另一个对象的从属关系.在 Qt 中,在 Qt 中,删除 ...

  2. Qt 程序退出时断言错误——_BLOCK_TYPE_IS_VALID(pHead->nBlockUse),由setAttribute(Qt::WA_DeleteOnClose)引起

    最近在学习QT,自己仿写了一个简单的QT绘图程序,但是在退出时总是报错,断言错误: 报错主要问题在_BLOCK_TYPE_IS_VALID(pHead->nBlockUse),是在关闭窗口时报的 ...

  3. Qt 窗口属性简介之Qt::WA_DeleteOnClose

    一.简述 今天介绍一个简单的窗口属性——Qt::WA_DeleteOnClose. 在正常创建窗口后,我们一般会调用close()方法来关闭窗口,这里我们看一下Q助手中关于close()方法的介绍. ...

  4. Qt 窗体的模态与非模态(setWindowFlags(Qt::WindowStaysOnTopHint);比较有用,还有Qt::WA_DeleteOnClose)

    概念 模态对话框(Modal Dialog)与非模态对话框(Modeless Dialog)的概念不是Qt所独有的,在各种不同的平台下都存在.又有叫法是称为模式对话框,无模式对话框等. 1. 模态窗体 ...

  5. Qt::WA_DeleteOnClose 造成的野指针问题

    今天遇到了一个由Qt::WA_DeleteOnClose造成的野指针问题,在网上搜到的一个求助贴如下(http://bbs.csdn.net/topics/380182058): 主窗口类QMainW ...

  6. Qt的模态对话框和非模态对话框 经常使用setAttribute (Qt::WA_DeleteOnClose)

    模态对话框就是指在子对话框弹出时,焦点被强行集中于该子对话框,子对话框不关闭,用户将无法操作其他的窗口.非模态相反,用户仍然可以操作其他的窗口,包括该子对话框的父对话框. 如果从线程角度来讲,模态对话 ...

  7. QWidget居中显示(qt窗口坐标原点是在”左上角”的,有图)

    转载请说明出处, 并附上原文链接http://blog.csdn.net/qq907482638/article/details/72189014. 问题描述 在Qt学习过程中,在让QDialog居中 ...

  8. QT 随笔目录

    [1]基础部分 <信号和槽机制> <信号与槽知识点> <QString 与 string转换> <QT 继承QWidget && 继承QDia ...

  9. QT中QWidget类简介

    一.详细描述 QWidget类是所有用户界面对象的基类.通俗的来讲,Qt基本上所有的UI类都是由QWidget继承出来的,而QWidget继承于QObject,  大家可以查阅Qt source 即可 ...

随机推荐

  1. 1、python接口测试requests

    import requestsimport jsonr=requests.get('http://www.baidu.com')                        #get 请求方式r=r ...

  2. HttpClient 链接管理

    SOCK is a TCP/IP level proxy protocol, not HTTP. It is not supported by HttpClient out of the box. O ...

  3. 教你使用SQL数据库复制系列(1-7)

    SQL Server 复制系列(文章索引) 一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 前言(Introduction) 复制逻辑结构图(Construction) ...

  4. wc 统计命令

    [root@localhost ~]# wc /etc/passwd // 统计行数.单词数.字符数 /etc/passwd [root@localhost ~]# wc -l /etc/passwd ...

  5. SVN服务的模式和多种访问方式 多种访问原理图解与优缺点

    SVN企业应用场景 SVN任是当前企业的主流.git正在发展,未来会成为主流.如果大家精力足够,建议同时掌握. 1.4运维人员掌握版本管理 对于版本管理系统,运维人员需要掌握的技术点: 1.安装.部署 ...

  6. 前端 HTML body标签相关内容 常用标签 段落标签 p标签

    段落标签 <p>,paragraph的简写.定义段落,默认段落之间有间隔的 浏览器展示特点: 跟普通文本一样,但我们可以通过css来设置当前段落的样式 是否又独占一行呢? 答案是的 块级元 ...

  7. vs2015智能提示英文改为中文

    vs2015智能提示英文改为中文 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework 进入 \v ...

  8. shell日志分析进阶篇

    前面我们说了shell分析日志常用指令,现在我们随ytkah一起看看shell日志分析进阶篇,假设日志文件为ytkah.log //统计不重复抓取数量 cat ytkah.log | awk '{pr ...

  9. shell脚本编写实例

    实际案例 1.判断接收参数个数大于1 [ $# -lt 1 ] && echo "至少需要一个参数" && { echo "我要退出了.. ...

  10. 构造器初始化(static)

    package demo; /* * 在类 的内部,变量定义的先后顺序决定了初始化的顺序.即使变量定义散布于方法定义之间, * 它们仍旧会在任何方法(包括构造器)被调用之前得到初始化. */ publ ...