mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QMenu>
#include <QToolBar>
#include <QAction>
#include <QTextEdit>
#include <QtEvents>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
QMenu *fileMenu;
QMenu *printMenu;
QToolBar *fileToolBar;
QAction *newFileAct;
QAction *openFileAct;
QAction *saveFileAct;
QAction *saveFileAsAct;
QAction *printPreviewAct;
QAction *printAct;
QTextEdit *CurrentContent;
bool CanNewOpenClose();
int ShowWarning_BeforeNewOpenClose();
int ShowWarning_WhenOpenFailed();
int ShowWarning_WhenSaveFailed();
private slots:
void CreateNewFile();
void OpenFile();
void SaveFile();
void SaveFileAs();
void SetIsCurrentContentModefied();
void closeEvent(QCloseEvent *event);
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QFileDialog>
#include <QIODevice>
#include <QTextStream>
QString CurrentFilePath=""; //当前文件路径
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
this->setMaximumSize(1000,800);
this->setMinimumSize(1000,800);
fileMenu = new QMenu(this);
printMenu = new QMenu(this);
fileToolBar = addToolBar("文件");
newFileAct = new QAction(tr("新建"),this);
openFileAct = new QAction(tr("打开"),this);
saveFileAct = new QAction(tr("保存"),this);
saveFileAsAct = new QAction(tr("另存"),this);
printAct = new QAction(tr("打印"),this);
printPreviewAct = new QAction(tr("打印预览"),this);
fileMenu = menuBar()->addMenu(tr("文件"));
fileMenu->addSeparator();
printMenu = menuBar()->addMenu(tr("打印"));
fileMenu->addAction(newFileAct);
fileMenu->addSeparator();
fileMenu->addAction(openFileAct);
fileMenu->addSeparator();
fileMenu->addAction(saveFileAct);
fileMenu->addSeparator();
fileMenu->addAction(saveFileAsAct);
printMenu->addAction(printAct);
printMenu->addSeparator();
printMenu->addAction(printPreviewAct);
fileToolBar->addAction(newFileAct);
fileToolBar->addSeparator();
fileToolBar->addAction(saveFileAct);
connect(newFileAct,SIGNAL(triggered()),this,SLOT(CreateNewFile())) ;
connect(openFileAct,SIGNAL(triggered()),this,SLOT(OpenFile())) ;
connect(saveFileAct,SIGNAL(triggered()),this,SLOT(SaveFile()) );
connect(saveFileAsAct,SIGNAL(triggered()),this,SLOT(SaveFileAs()) );
CurrentContent = new QTextEdit(this);
CurrentContent->document()->setModified(false); //将当前文本设置为未被修改
this->setCentralWidget(CurrentContent); //将TextEdit设置为中央控件
connect(CurrentContent,SIGNAL(textChanged()),this,SLOT(SetIsCurrentContentModefied()) ); //一旦文本被改变,则调用函数将文本设置为已被修改
}
MainWindow::~MainWindow()
{
}
bool MainWindow::CanNewOpenClose() //判断是否在新建、打开、关闭之前文件是否已保存
{
return !(CurrentContent->document()->isModified());
}
void MainWindow::CreateNewFile() //创建新文件
{
if(!CanNewOpenClose())
{
int ret = ShowWarning_BeforeNewOpenClose(); //如果文件被修改但是未保存,弹出警告对话框
if(ret == QMessageBox::Save)
{SaveFile();
return;
}
else if(ret == QMessageBox::Cancel)
return;
}
CurrentContent->clear();
CurrentFilePath = ""; //因为新建了文件,所以将当前文件路径设为空
CurrentContent->document()->setModified(false); //将当前文本设置为未被修改
}
void MainWindow::OpenFile()
{
if(!CanNewOpenClose())
{
int ret = ShowWarning_BeforeNewOpenClose();
if(ret == QMessageBox::Save)
{SaveFile();
return;
}
else if(ret == QMessageBox::Cancel)
return;
}
QString filePath = QFileDialog::getOpenFileName(this,tr("打开文件"),tr(""),tr("文本文件(*.txt)"));
if(filePath == "")
return;
CurrentFilePath = filePath;
QFile file(filePath);
if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
ShowWarning_WhenOpenFailed();
CurrentFilePath = "";
return;
}
QTextStream textStream(&file);
CurrentContent->setText(textStream.readAll());
file.close();
CurrentContent->document()->setModified(false);
}
void MainWindow::SaveFile()
{
if(CurrentFilePath == "")
{
SaveFileAs();
return;
}
QFile file(CurrentFilePath);
if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
{
ShowWarning_WhenSaveFailed();
CurrentFilePath = "";
return;
}
QTextStream textStream(&file);
file.resize(0);
textStream<<CurrentContent->toPlainText();
file.close();
CurrentContent->document()->setModified(false);
}
void MainWindow::SaveFileAs()
{
QString filePath = QFileDialog::getSaveFileName(this,tr("另存"),tr(""),tr("文本文件(*.txt)"));
if(filePath == "")
return;
CurrentFilePath = filePath;
QFile file(filePath);
if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
{
ShowWarning_WhenSaveFailed();
CurrentFilePath = "";
return;
}
QTextStream textStream(&file);
textStream<<CurrentContent->toPlainText();
file.close();
CurrentContent->document()->setModified(false);
}
void MainWindow::SetIsCurrentContentModefied()
{
CurrentContent->document()->setModified(true); //文本被修改时调用的函数,将文本设置为已被修改
}
//下面是为了简化QMessageBox而写的函数
int MainWindow::ShowWarning_BeforeNewOpenClose()
{
return QMessageBox::warning(this,tr("警告"),tr("还未保存"),QMessageBox::Save|QMessageBox::Ignore|QMessageBox::Cancel);
}
int MainWindow::ShowWarning_WhenOpenFailed()
{
return QMessageBox::warning(this,tr("错误"),tr("打开文件失败"));
}
int MainWindow::ShowWarning_WhenSaveFailed()
{
return QMessageBox::warning(this,tr("错误"),tr("保存文件失败"));
}
void MainWindow::closeEvent(QCloseEvent *event) //关闭按钮触发时此函数被调用,检查文本是否已保存
{
if(!CanNewOpenClose())
{
int ret = ShowWarning_BeforeNewOpenClose();
if(ret == QMessageBox::Save)
{
SaveFile();
return;
}
else if(ret == QMessageBox::Cancel)
event->ignore(); //忽视关闭信号
else
event->accept(); //接受关闭信号,文本关闭
}
}
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}