QT5:重写closeEvent.

不废话了看代码吧:

 #include <QMainWindow>
#include <memory>
#include <QTextEdit>
#include <QCloseEvent>
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow()=default;
private:
    void open()noexcept;
    void save()noexcept;
    std::shared_ptr<QAction> openAction;
    std::shared_ptr<QAction> saveAction;
    std::shared_ptr<QMenu> openMenu;
    std::shared_ptr<QToolBar> theToolBar;
    std::shared_ptr<QDockWidget> dockWidget;
    std::shared_ptr<QTextEdit> textEdit;
protected:
    virtual void closeEvent(QCloseEvent* ev)override;
};
 #include "mainwindow.h"
#include <QMessageBox>
#include <QStatusBar>
#include <QMenuBar>
#include <QToolBar>
#include <QDockWidget>
#include <QDebug>
#include <QFileDialog>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    this->setWindowTitle(tr("shihuawoaini [*]")); //注意这里的[*]这是个占位符(placeholder).
    this->setMinimumSize(500, 400);
    qDebug()<<iconSize();
    this->openAction = std::shared_ptr<QAction>(new QAction(tr("&open"), this));
    (this->openAction)->setShortcut(QKeySequence::Open); //设置快捷建.
    (this->openAction)->setStatusTip(tr("open..."));
    connect((this->openAction).get(), &QAction::triggered, this, &MainWindow::open);
    this->saveAction = std::shared_ptr<QAction>(new QAction(tr("&save"), this));
    saveAction->setShortcut(QKeySequence::Save); //设置快捷键.
    saveAction->setStatusTip(tr("save..."));
    connect(saveAction.get(), &QAction::triggered, this, &MainWindow::save);
    this->openMenu = std::shared_ptr<QMenu>(menuBar()->addMenu(tr("open")));
    (this->openMenu)->addAction(this->openAction.get());
    this->theToolBar = std::shared_ptr<QToolBar>(this->addToolBar(tr("File")));
    (this->theToolBar)->addAction(this->openAction.get());
    theToolBar->addAction(saveAction.get());
    this->dockWidget = std::shared_ptr<QDockWidget>(new QDockWidget(tr("DockWidget")));
    this->addDockWidget(Qt::LeftDockWidgetArea, (this->dockWidget).get());
    this->statusTip();
    this->statusBar();
    this->textEdit = std::shared_ptr<QTextEdit>(new QTextEdit(this));
    this->setCentralWidget(textEdit.get());
    connect(textEdit.get(), &QTextEdit::textChanged, [=](){ this->setWindowModified(true); }); //重点!!!!!!!!!!!!!!!!!!!!! 
}
void MainWindow::open()noexcept
{
    QString fileName = QFileDialog::getOpenFileName(this, tr("open a file."), ".", tr("Text files(*.txt)"));
    if(!fileName.isEmpty()){
        QFile file(fileName);
        if(!file.open(QIODevice::ReadOnly | QIODevice::Text)){
            QMessageBox::warning(this, tr("Read File"), tr("Can not open file.\n%1").arg(fileName));
            return;
        }else{
            QTextStream readFile(&file);
            textEdit->setText(readFile.readAll());
            file.close();
        }
    }else{
        QMessageBox::warning(this, tr("Path"), tr("You do not select any file."));
    }
}
void MainWindow::save()noexcept
{
    QString fileName = QFileDialog::getSaveFileName(this, tr("save file"),".", tr("Text files(*.txt);;Images (*.png *.jpg)"));
    if(!fileName.isEmpty()){
        QFile file(fileName);
        if(!file.open(QIODevice::WriteOnly | QIODevice::Text)){
            QMessageBox::warning(this, tr("write file"), tr("open nothing"));
            return;
        }
        QTextStream writeFile(&file);
        writeFile<<(this->textEdit)->toPlainText();
        file.close();
    }else{
        QMessageBox::warning(this, tr("write fail"), tr("nothing for writing"));
    }
}
void MainWindow::closeEvent(QCloseEvent* ev) //重点!!!!!!!!!!!!!!!!! 
{
    if(this->isWindowModified()){
        bool boolean = QMessageBox::question(this, tr("Close Window"), tr("Do you want exit?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::Yes;
        qDebug()<<boolean;
        if(boolean){
            ev->accept();
        }else{
            ev->ignore();
        }
    }else{
        ev->accept();
    }

转载于:https://my.oschina.net/SHIHUAMarryMe/blog/651809

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值