QWidget 的 close 与 Qt::WA_DeleteOnClose
【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的更多相关文章
- Qt浅谈之一:内存泄露(总结),对于QWidget可以setAttribute(Qt::WA_DeleteOnClose),而且绝对不能手动删除栈上的对象
一.简介 Qt内存管理机制:Qt 在内部能够维护对象的层次结构.对于可视元素,这种层次结构就是子组件与父组件的关系:对于非可视元素,则是一个对象与另一个对象的从属关系.在 Qt 中,在 Qt 中,删除 ...
- Qt 程序退出时断言错误——_BLOCK_TYPE_IS_VALID(pHead->nBlockUse),由setAttribute(Qt::WA_DeleteOnClose)引起
最近在学习QT,自己仿写了一个简单的QT绘图程序,但是在退出时总是报错,断言错误: 报错主要问题在_BLOCK_TYPE_IS_VALID(pHead->nBlockUse),是在关闭窗口时报的 ...
- Qt 窗口属性简介之Qt::WA_DeleteOnClose
一.简述 今天介绍一个简单的窗口属性——Qt::WA_DeleteOnClose. 在正常创建窗口后,我们一般会调用close()方法来关闭窗口,这里我们看一下Q助手中关于close()方法的介绍. ...
- Qt 窗体的模态与非模态(setWindowFlags(Qt::WindowStaysOnTopHint);比较有用,还有Qt::WA_DeleteOnClose)
概念 模态对话框(Modal Dialog)与非模态对话框(Modeless Dialog)的概念不是Qt所独有的,在各种不同的平台下都存在.又有叫法是称为模式对话框,无模式对话框等. 1. 模态窗体 ...
- Qt::WA_DeleteOnClose 造成的野指针问题
今天遇到了一个由Qt::WA_DeleteOnClose造成的野指针问题,在网上搜到的一个求助贴如下(http://bbs.csdn.net/topics/380182058): 主窗口类QMainW ...
- Qt的模态对话框和非模态对话框 经常使用setAttribute (Qt::WA_DeleteOnClose)
模态对话框就是指在子对话框弹出时,焦点被强行集中于该子对话框,子对话框不关闭,用户将无法操作其他的窗口.非模态相反,用户仍然可以操作其他的窗口,包括该子对话框的父对话框. 如果从线程角度来讲,模态对话 ...
- QWidget居中显示(qt窗口坐标原点是在”左上角”的,有图)
转载请说明出处, 并附上原文链接http://blog.csdn.net/qq907482638/article/details/72189014. 问题描述 在Qt学习过程中,在让QDialog居中 ...
- QT 随笔目录
[1]基础部分 <信号和槽机制> <信号与槽知识点> <QString 与 string转换> <QT 继承QWidget && 继承QDia ...
- QT中QWidget类简介
一.详细描述 QWidget类是所有用户界面对象的基类.通俗的来讲,Qt基本上所有的UI类都是由QWidget继承出来的,而QWidget继承于QObject, 大家可以查阅Qt source 即可 ...
随机推荐
- ajax 上传文件,显示进度条,进度条100%,进度条隐藏,出现卡顿就隐藏进度条,显示正在加载,再显示上传完成
<form id="uploadForm" method="post" enctype="multipart/form-data"&g ...
- python摸爬滚打之day12----生成器, 各种生成式
1.生成器 生成器的本质就是迭代器. 1.1 获取生成器 1: 生成器函数 函数中出现 "yield" 的函数就是一个生成器函数, 再次执行函数时就不是运行函数而是获取生成器. ...
- eclipse背景色设置成护眼色(豆沙绿)
1.点击windows -->preferences 2.展开Editors 3.选择自定义颜色 4.把色调调成:85 饱和度调成:123 亮度调成205 即可调成豆沙绿色了 然后点确定.
- codechef Sum of Cubes 图论
正解:图论+数学 解题报告: 先放个传送门QwQ 然后放下题目大意?就说给定简单图,无自环或重边,然后求(∑e[i][j])k,i,j∈S,S为点集的子集 然后因为k的取值只有[1,3],所以这里分类 ...
- bzoj 2563 [2012国家集训队Round 1 day2] 阿狸和桃子的游戏 贪心
正解:贪心 解题报告: 链接在这儿! 知道解法之后会jio的好像很简单的样子……其实挺难想到的QAQ 不过大佬讲了方法之后还是懂了 有一个很神仙的想法就是,你可以理解为每个点周围的边都有半个是自己的, ...
- 5分钟简述Spring中的DI与AOP
Spring的两个核心特性: 依赖注入(dependency injection,DI) 面向切面编程(aspect oriented programming,AOP) 依赖注入(dependency ...
- intellij idea建立maven项目
配置jdk 配置mvn http://jingyan.baidu.com/article/d8072ac45d3660ec94cefd51.html 右键“计算机”,选择“属性”,之后点击“高级系统设 ...
- 关于mobilesroll使用方法的再次声明
js $('#name').click(function(valueText) { $('#demo').mobiscroll('show'); // return false; }); $(&quo ...
- 帝国cms搜索关键字调用标签(showsearch)怎么用
前面ytkah介绍了如何让帝国CMS7.2搜索模板支持动态标签调用,现在我们来说说怎么调用帝国cms搜索关键字调用标签(showsearch).在帝国cms后台那边的使用方法:[showsearch] ...
- w97常用功能代码
1,onclick中添加日期控件 2,onpicked事件即是点击控件后触发的事件 3,dp.cal.getNewDateStr()即是点击到的日期字符串 <script> functio ...