我們平時在使用windows的notepad以及其他各種軟件過程中,都會有保存文件和另存為兩種功能,這兩者不能混為一談。
一、保存時有兩種情況,一種是對於新創建的文件,一種是對於已有的文件,前者需要打開文件瀏覽對話框取名保存,后者直接保存覆蓋源文件即可
二、另存為總是需要打開文件瀏覽對話框的
三、為了程序能分辨到底是新建的文件還是已有的文件,需要設置標記位
四、在沒有打開文件的時候,設置保存、另存為按鈕不可見(我沒有采取這種做法,而是直接彈出提示框,當然這使得程序耦合性變高了)
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QMenu> #include <QAction> #include <QTextEdit> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private: Ui::MainWindow *ui; QMenu *file_menu; QMenu *print_menu; QAction *file_newAct; QAction *file_openAct; QAction *file_saveAct; QAction *file_saveAsAct; QAction *print_previewAct; QAction *print_printAct; QTextEdit *textEdit; private slots: void Open_File(); void Create_NewFile(); void Save_File(); void Save_FileAs(); void closeEvent(QCloseEvent *event); }; #endif // MAINWINDOW_H
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QFileDialog> #include <QMessageBox> #include <QFile> #include <QFileDevice> #include <QTextStream> #include <QtEvents> int Flag_isOpen = 0; //標記:判斷是否打開或創建了一個文件 int Flag_IsNew = 0; //標記:如果新建了文件就為1,初始值為0 QString Last_FileName; //最后一次保存的文件的名字 QString Last_FileContent; //最后一次保存文件的內容 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); this->setMaximumSize(800,800); this->setMinimumSize(800,800); file_menu = new QMenu(this); print_menu = new QMenu(this); textEdit = new QTextEdit(this); textEdit->setGeometry(QRect(150,100,500,600)); textEdit->setHidden(true); //隱藏文本編輯 //創建菜單項 file_newAct = new QAction(tr("新建"),this); file_openAct = new QAction(tr("打開"),this); file_saveAct = new QAction(tr("保存"),this); file_saveAsAct = new QAction(tr("另存其為"),this); print_previewAct = new QAction(tr("打印預覽"),this); print_printAct = new QAction(tr("打印"),this); //添加菜單 file_menu = menuBar()->addMenu(tr("文件")); print_menu = menuBar()->addMenu(tr("打印")); //添加菜單項 file_menu->addSeparator(); file_menu->addAction(file_newAct); file_menu->addSeparator(); file_menu->addAction(file_openAct); file_menu->addSeparator(); file_menu->addAction(file_saveAct); file_menu->addSeparator(); file_menu->addAction(file_saveAsAct); print_menu->addSeparator(); print_menu->addAction(print_previewAct); print_menu->addSeparator(); print_menu->addAction(print_printAct); //添加觸發函數 connect(file_openAct,SIGNAL(triggered()),this,SLOT(Open_File()) ); connect(file_newAct,SIGNAL(triggered()),this,SLOT(Create_NewFile()) ); connect(file_saveAct,SIGNAL(triggered()),this,SLOT(Save_File()) ); connect(file_saveAsAct,SIGNAL(triggered()),this,SLOT(Save_FileAs()) ); } MainWindow::~MainWindow() { delete ui; } void MainWindow::Open_File() { QString fileName; fileName = QFileDialog::getOpenFileName(this,tr("Open File"),tr(""),tr("Text File (*.txt)")); if(fileName == "") //如果用戶直接關閉了文件瀏覽對話框,那么文件名就為空值,直接返回 { return; } else { QFile file(fileName); if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) { QMessageBox::warning(this,tr("錯誤"),tr("打開文件失敗")); return; } else { if(!file.isReadable()) { QMessageBox::warning(this,tr("錯誤"),tr("該文件不可讀")); } else { QTextStream textStream(&file); //讀取文件,使用QTextStream while(!textStream.atEnd()) { textEdit->setPlainText(textStream.readAll()); } textEdit->show(); file.close(); Flag_isOpen = 1; Last_FileName = fileName; } } } } void MainWindow::Create_NewFile() //創建新文件 { textEdit->clear(); //清除原先文件內容 textEdit->setHidden(false); //顯示文本框 Flag_IsNew = 1; //新文件標記位設為1 Flag_isOpen = 1; //新文件創建 標記位設為1 } void MainWindow::Save_File() { if(Flag_IsNew) //如果新文件標記位為1,則彈出保存文件對話框 { if(textEdit->toPlainText() == "") { QMessageBox::warning(this,tr("警告"),tr("內容不能為空!"),QMessageBox::Ok); } else { QFileDialog fileDialog; QString str = fileDialog.getSaveFileName(this,tr("Open File"),"/home",tr("Text File(*.txt)")); if(str == "") { return; } QFile filename(str); if(!filename.open(QIODevice::WriteOnly | QIODevice::Text)) { QMessageBox::warning(this,tr("錯誤"),tr("打開文件失敗"),QMessageBox::Ok); return; } else { QTextStream textStream(&filename); QString str = textEdit->toPlainText(); textStream<<str; Last_FileContent = str; } QMessageBox::information(this,"保存文件","保存文件成功",QMessageBox::Ok); filename.close(); Flag_IsNew = 0; //新文件標記位記為0 Last_FileName = str;//保存文件內容 } } else //否則,新文件標記位是0,代表是舊文件,默認直接保存覆蓋源文件 { if(Flag_isOpen) //判斷是否創建或打開了一個文件 { QFile file(Last_FileName); if(!file.open(QIODevice::WriteOnly | QIODevice::Text)) { QMessageBox::warning(this,tr("警告"),tr("打開文件失敗")); return; } else { QTextStream textStream(&file); QString str = textEdit->toPlainText(); textStream<<str; Last_FileContent = str; file.close(); } } else { QMessageBox::warning(this,tr("警告"),tr("請先創建或者打開文件")); return; } } } void MainWindow::Save_FileAs() //另存為 { QFileDialog fileDialog; QString fileName = fileDialog.getSaveFileName(this,tr("Open File"),"/home",tr("Text File(*.txt)")); if(fileName == "") { return; } QFile file(fileName); if(!file.open(QIODevice::WriteOnly | QIODevice::Text)) { QMessageBox::warning(this,tr("錯誤"),tr("打開文件失敗")); return; } else { QTextStream textStream(&file); QString str = textEdit->toPlainText(); textStream<<str; QMessageBox::warning(this,tr("提示"),tr("保存文件成功")); Last_FileContent = str; Last_FileName = fileName; Flag_IsNew = 0; file.close(); } } void MainWindow::closeEvent(QCloseEvent *event) {
#include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); } main.cpp
if(textEdit->toPlainText() == Last_FileContent) //如果文本框的內容就是上次保存的文件內容,則接收信號,關閉 event->accept(); else //否則彈出警告,有修改的內容未保存 { if(QMessageBox::warning(this,tr("警告"),tr("文件還未保存,確定退出?"),QMessageBox::Yes|QMessageBox::No) == QMessageBox::Yes) { event->accept(); } else event->ignore(); } } mainwindow.cpp
轉自:https://blog.csdn.net/WQ_1996/article/details/78237151
