#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QFile>
class QTextEdit;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
public:
void initMenuBar();
private:
QFile* m_file;
QTextEdit* m_edit;
QString m_curPath;
private slots:
void newSlot();
void openSlot();
void saveSlot();
bool savAsSlot();
void wrapSlot(bool isChecked);
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include <QMenuBar>
#include <QMenu>
#include <QAction>
#include <QFile>
#include <QFileDialog>
#include <QTextEdit>
#include <QFileInfo>
#include <QMessageBox>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
this->resize(480,360);
this->setWindowTitle("QT");
m_file = new QFile(this);
m_edit = new QTextEdit(this);
this->setCentralWidget(m_edit);
initMenuBar();
}
void MainWindow::initMenuBar()
{
QMenuBar* menuBar = this->menuBar();
QMenu* fileMenu =menuBar->addMenu("文件(&F)");
fileMenu->addAction("新建",this,SLOT(newSlot()),QKeySequence("Ctrl+N"));
fileMenu->addAction("打開",this,SLOT(openSlot()),QKeySequence("Ctrl+O"));
fileMenu->addAction("保存",this,SLOT(saveSlot()),QKeySequence("Ctrl+S"));
fileMenu->addAction("另存爲",this,SLOT(savAsSlot()));
fileMenu->addAction("關閉",this,SLOT(close()),QKeySequence("Ctrl+Q"));
//自動換行
QMenu* styleMenu = menuBar->addMenu("格式(&F)");
QAction* wrapAction = styleMenu->addAction("換行(W)",this,SLOT(wrapSlot(bool)));
wrapAction->setCheckable(true);
wrapAction->setChecked(true);
}
void MainWindow::wrapSlot(bool isChecked)
{
isChecked ? m_edit->setWordWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere)
: m_edit->setWordWrapMode(QTextOption::NoWrap);
}
void MainWindow::newSlot()
{
//新建:有內容保存後清空或者直接清空,在空白edit編輯後,另存爲
if(m_edit->document()->isModified())
{
int sb = QMessageBox::warning(this,"是否保存","是否保存?",QMessageBox::Save | QMessageBox::No |QMessageBox::Cancel);
switch (sb) {
case QMessageBox::Save:
if(m_curPath.isEmpty())
{
if(savAsSlot())
break;
else
saveSlot();
}
case QMessageBox::No:
m_edit->clear();
m_curPath.clear();
break;
default:
break;
}
}
else
{
m_edit->clear();
m_curPath.clear();
}
}
void MainWindow::openSlot()
{
//如果textedit有修改或輸入內容,先詢問另存爲
if(m_edit->document()->isModified())
{
int sb = QMessageBox::warning(this,"是否保存","是否保存?",QMessageBox::Save | QMessageBox::No |QMessageBox::Cancel);
switch (sb)
{
case QMessageBox::Save:
if(m_curPath.isEmpty())//如果路徑爲空
{
if(savAsSlot())//如果savAsSlot()返回1,表示沒有選擇另存,終止循環
break;
else
saveSlot();//否則表示有原路徑,是打開的文件,直接保存
}
case QMessageBox::No:
m_edit->clear();
m_curPath.clear();
break;
default:
break;
}
}
else
{
QString filename = QFileDialog::getOpenFileName(this,"打開",m_curPath,"text(*.txt)");
if(QFileInfo(filename).isFile())
{
m_file->setFileName(filename);
m_file->open(QIODevice::ReadOnly);
m_edit->setText(m_file->readAll());
m_file->close();
}
}
}
void MainWindow::saveSlot()
{
if(m_curPath.isEmpty())//如果路徑爲空,調用另存爲
{
savAsSlot();
}
else
{
//這裏是一個按m_file中原路徑,保存文件的功能
m_file->open(QIODevice::ReadWrite | QIODevice::Truncate);
m_file->write(m_edit->toPlainText().toUtf8());
m_file->close();
}
}
bool MainWindow::savAsSlot()
{
QString filename = QFileDialog::getSaveFileName(this,"另存爲", m_curPath,"text(*.txt)");
if(QFileInfo(filename).isNativePath())
{
m_curPath = filename;
m_file->setFileName(filename);
m_file->open(QIODevice::ReadWrite | QIODevice::Truncate);
m_file->write(m_edit->toPlainText().toUtf8());
m_file->close();
}
return filename.isEmpty();
}
MainWindow::~MainWindow()
{
}