【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. zabbix准备:mysql安装

    php在编译时需要mysql的配置,这样PHP远程连接mysql才有用.1.创建mysql用户和相关目录(配置文件里设置的目录) groupadd mysql useradd -g mysql -M ...

  2. 批量增删改"_bulk"

    除了delete以外,每个操作需要两个json字符串,语法如下:{"action":{"metadata"}}{"data"}bulk ap ...

  3. Intellij IDEA中修改Maven项目的项目名称

    1. 原项目名:votesystem-redis     想要重命名成新项目名:votesystem 2. 我们对此项目名进行Rename 3. 再对此项目所在的目录下进行修改 4. 重新打开项目 若 ...

  4. Finecms模板标签调用小结 方便快速入门

    最近接了一个单子客户要求用finecms进行建站,由于也是php代码,也可以直接调用相关函数,所以上手相对比较快,ytkah总结了一些常用的函数方便您快速入门Finecms.一个网站一般由主页.栏目页 ...

  5. Python3学习之路~5.3 random模块

    random模块常用方法: import random # 随机数 print(random.random()) # 生成一个0到1的随机浮点数,0 <= n < 1.0 print(ra ...

  6. AxMIMS系统开发环境搭建

    系统环境:Windows10, VS2013, Qt5.6.2 64bit 1.CloudCompare2.8.1编译 (shapefilelib1.3,geos3.6.1) 2.PCL-1.8.0- ...

  7. 异常处理的捕捉:try{}catch(异常类 变量)finally{最终执行}

    可以对异常进行针对性处理的方式.try{ //需要被检查的异常 }catch(异常类  变量)//该变量用于接收发生的异常{ //处理异常的代码 }finally{ //一定会被执行的代码. }

  8. dialog问题记录

    这个怎么回事,怎么会负利润 http://mmbiz.qpic.cn/mmbiz_jpg/sd9PceC1NdAEVpR5pKerugkpEPEUIsBVoaz5ibTiaHtxoickmF2bXqF ...

  9. 小a和uim之大逃离

    题目传送门 #include <bits/stdc++.h> using namespace std; #define ll long long #define re register # ...

  10. SVM、LR、决策树的对比

    一.LR LR,DT,SVM都有自身的特性,首先来看一下LR,工业界最受青睐的机器学习算法,训练.预测的高效性能以及算法容易实现使其能轻松适应工业界的需求.LR还有个非常方便实用的额外功能就是它并不会 ...