QT——記事本

#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()
{

}









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章