zoukankan      html  css  js  c++  java
  • QWidget 的 close 与 Qt::WA_DeleteOnClose

    【1】close 与 Qt::WA_DeleteOnClose简介

    1.1 Qt源码

     1 /*!
     2     Closes this widget. Returns c true if the widget was closed;
     3     otherwise returns c false.
     4 
     5     First it sends the widget a QCloseEvent. The widget is
     6     l{hide()}{hidden} if it l{QCloseEvent::accept()}{accepts}
     7     the close event. If it l{QCloseEvent::ignore()}{ignores}
     8     the event, nothing happens. The default
     9     implementation of QWidget::closeEvent() accepts the close event.
    10 
    11     If the widget has the Qt::WA_DeleteOnClose flag, the widget
    12     is also deleted. A close events is delivered to the widget no
    13     matter if the widget is visible or not.
    14 
    15     The l QApplication::lastWindowClosed() signal is emitted when the
    16     last visible primary window (i.e. window with no parent) with the
    17     Qt::WA_QuitOnClose attribute set is closed. By default this
    18     attribute is set for all widgets except transient windows such as
    19     splash screens, tool windows, and popup menus.
    20 
    21 */
    22 
    23 bool QWidget::close()
    24 {
    25     return d_func()->close_helper(QWidgetPrivate::CloseWithEvent);
    26 }
    27 
    28 /*!
    29     This event handler is called with the given a event when Qt receives a window
    30     close request for a top-level widget from the window system.
    31 
    32     By default, the event is accepted and the widget is closed. You can reimplement
    33     this function to change the way the widget responds to window close requests.
    34     For example, you can prevent the window from closing by calling l{QEvent::}{ignore()}
    35     on all events.
    36 
    37     Main window applications typically use reimplementations of this function to check
    38     whether the user's work has been saved and ask for permission before closing.
    39     For example, the l{Application Example} uses a helper function to determine whether
    40     or not to close the window:
    41 
    42     snippet mainwindows/application/mainwindow.cpp 3
    43     snippet mainwindows/application/mainwindow.cpp 4
    44 
    45     sa event(), hide(), close(), QCloseEvent, {Application Example}
    46 */
    47 
    48 void QWidget::closeEvent(QCloseEvent *event)
    49 {
    50     event->accept();
    51 }

    1.2 公共槽函数

    1.3 帮助文档

    1.4 Qt::WA_DeleteOnClose

    【2】实例代码

    1.1 TWidget.h

     1 #ifndef TWIDGET_H
     2 #define TWIDGET_H
     3 
     4 #include <QWidget>
     5 #include <QDebug>
     6 
     7 namespace Ui
     8 {
     9     class TWidget;
    10 }
    11 
    12 class MyWidget : public QWidget
    13 {
    14 public:
    15     MyWidget(QWidget *parent = NULL);
    16     ~MyWidget();
    17 };
    18 
    19 class TWidget : public QWidget
    20 {
    21     Q_OBJECT
    22 
    23 public:
    24     explicit TWidget(QWidget *parent = 0);
    25     ~TWidget();
    26 
    27 private slots:
    28     void onPushButtonPressed();
    29 
    30 private:
    31     Ui::TWidget *m_pUI;
    32     MyWidget *m_pMyWidget;
    33 };
    34 
    35 #endif // TWIDGET_H

     1.2 TWidget.cpp

     1 #include "TWidget.h"
     2 #include "ui_TWidget.h"
     3 
     4 MyWidget::MyWidget(QWidget *parent)
     5     : QWidget(parent)
     6 {
     7     qDebug() << "construct :: MyWidget";
     8 }
     9 
    10 MyWidget::~MyWidget()
    11 {
    12     qDebug() << "destruct :: ~MyWidget";
    13 }
    14 
    15 TWidget::TWidget(QWidget *parent)
    16     : QWidget(parent)
    17     , m_pUI(new Ui::TWidget)
    18     , m_pMyWidget(NULL)
    19 {
    20     m_pUI->setupUi(this);
    21 
    22     m_pMyWidget = new MyWidget();
    23     m_pMyWidget->setFixedSize(200, 200);
    24     m_pMyWidget->setAttribute(Qt::WA_DeleteOnClose); // 设置属性Qt::WA_DeleteOnClose
    25 
    26     connect(m_pUI->pushButton, &QPushButton::pressed, this, &TWidget::onPushButtonPressed);
    27 }
    28 
    29 TWidget::~TWidget()
    30 {
    31     if (m_pUI != NULL)
    32     {
    33         delete m_pUI;
    34         m_pUI = NULL;
    35     }
    36 
    37     if (m_pMyWidget != NULL)
    38     {
    39         delete m_pMyWidget;
    40         m_pMyWidget = NULL;
    41     }
    42 }
    43 
    44 void TWidget::onPushButtonPressed()
    45 {
    46     if (m_pMyWidget != NULL)
    47     {
    48         m_pMyWidget->show();
    49     }
    50 }

     1.3 main.cpp

     1 #include "TWidget.h"
     2 #include <QApplication>
     3 
     4 int main(int argc, char *argv[])
     5 {
     6     QApplication a(argc, argv);
     7 
     8     TWidget w;
     9     w.show();
    10 
    11     return a.exec();
    12 }

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

    1.5 运行结果:

    注意观察,现象如下:

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

    1 construct :: MyWidget
    2 destruct :: ~MyWidget

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

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

    【3】总结

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

    Good Good Study, Day Day Up.

    顺序 选择 循环 总结

  • 相关阅读:
    取得当前目录下所有文件名
    windows用户态和内核态
    MFC CDialog中控件跨线程访问失败
    Effective C++学习笔记(八)
    Effective C++学习笔记(六)
    Effective C++学习笔记(七)
    Effective C++学习笔记(五)
    Effective C++学习笔记(四)
    Effective C++学习笔记(三)
    Effective C++学习笔记(二)
  • 原文地址:https://www.cnblogs.com/Braveliu/p/8383691.html
Copyright © 2011-2022 走看看