Qt 檔案的新建、開啟、儲存、另存為 (改進版本)
阿新 • • 發佈:2019-02-16
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();
}