简单文本编辑器

学了好久Qt了,一直感觉没怎么学会,应该还是练得少。先来个简单的文本编辑器,可惜一次只能编辑一个文本,没有状态栏。下次写个多文本的试试。
main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTextEdit>
#include <QString>
#include <QMenuBar>
#include <QAction>
#include <QMenu>
#include <QFile>
#include <QFontDialog>
#include <QCloseEvent>

class MainWindow : public QMainWindow
{
    Q_OBJECT
private:
    QTextEdit* textEdit;
    QMenuBar* menuBar;
    QMenu *file,*edit,*about;
    QAction *newFile,*openFile,*saveFile,*saveFileAs,*exit;
    QAction *redo,*undo,*cut,*copy,*paste,*font,*author;
    //新建文件,flag为1
    //打开已存在的文件,flag为2
    int flag;
    QString curFile;

    //检查当前文件是否保存
    bool maybesave();
    bool savefile(const QString&);

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

protected:
    void closeEvent(QCloseEvent *event);

private slots:
    void aboutAuthor();
    void newfile();
    void openfile();
    void closeEditor();
    bool savefileas();
    bool save();

    void Redo();
    void Undo();
    void Cut();
    void Copy();
    void Paste();

    void setTextFont();
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include <QTextEdit>
#include <QMessageBox>
#include <QMenuBar>
#include <QDebug>
#include <QPushButton>
#include <QMenu>
#include <QString>
#include <QFile>
#include <QTextStream>
#include <QFileDialog>
#include <QAction>


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    //初始化文件名
    curFile = tr("未命名.txt");
    setWindowTitle(curFile);
    this->resize(QSize(800,600));
    textEdit = new QTextEdit();

    setCentralWidget(textEdit);
    menuBar = new QMenuBar(this);
    file = new QMenu("File",this);
    edit = new QMenu("Edit",this);
    about = new QMenu("About",this);

    newFile = new QAction("New",this);
    openFile = new QAction("Open",this);
    saveFile = new QAction("Save File",this);
    saveFileAs = new QAction("Save File As",this);
    exit = new QAction("Exit",this);

    redo = new QAction("Redo",this);
    undo = new QAction("Undo",this);
    cut = new QAction("Cut",this);
    copy = new QAction("Copy",this);
    paste = new QAction("Paste",this);
    font = new QAction("Font",this);

    author = new QAction("Author",this);

    file->addAction(newFile);
    file->addAction(openFile);
    file->addAction(saveFile);
    file->addAction(saveFileAs);
    file->addAction(exit);

    edit->addAction(redo);
    edit->addAction(undo);
    edit->addAction(cut);
    edit->addAction(copy);
    edit->addAction(paste);
    edit->addAction(font);

    about->addAction(author);

    menuBar->addMenu(file);
    menuBar->addMenu(edit);
    menuBar->addMenu(about);
    setMenuBar(menuBar);
    //新建文件
    connect(newFile,&QAction::triggered,this,&newfile);
    //打开文件
    connect(openFile,&QAction::triggered,this,&openfile);
    //保存文件
    connect(saveFile,&QAction::triggered,this,&save);
    //文件另存为
    connect(saveFileAs,&QAction::triggered,this,&savefileas);
    //关于作者
    connect(author,&QAction::triggered,this,&aboutAuthor);
    //关闭编辑器
    connect(exit,&QAction::triggered,this,&closeEditor);

    //恢复
    connect(redo,&QAction::triggered,this,&Redo);
    //撤销
    connect(undo,&QAction::triggered,this,&Undo);
    //剪切
    connect(cut,&QAction::triggered,this,&Cut);
    //复制
    connect(copy,&QAction::triggered,this,&Copy);
    //粘贴
    connect(paste,&QAction::triggered,this,&Paste);
    //选择字体
    connect(font,&QAction::triggered,this,&setTextFont);
}

MainWindow::~MainWindow()
{
    delete redo;
    delete undo;
    delete cut;
    delete copy;
    delete paste;
    delete font;
    delete author;

    delete newFile;
    delete openFile;
    delete saveFile;
    delete saveFileAs;
    delete exit;

    delete file;
    delete edit;
    delete about;

    delete menuBar;

    delete textEdit;
}

void MainWindow::aboutAuthor()
{
    QMessageBox::information(this,"About Author","i am yong heng");
    return ;
}

//新建文件
void MainWindow::newfile()
{
    //新建文件的时候要判断当前文件是否保存
    if(maybesave())
    {
        curFile = tr("未命名.txt");
        flag = 1;
        setWindowTitle(curFile);
        textEdit->clear();
        textEdit->setVisible(true);
    }
}

//打开文件    最好也要先检查一下当前文件是否保存
void MainWindow::openfile()
{
    flag = 2;
    curFile = QFileDialog::getOpenFileName(this,tr("Open File"),".",tr("Text(*.txt)"));
    QFile file(curFile);
    //我不检查文件是否存在了
    file.open(QIODevice::ReadOnly);
    QTextStream mcin(&file);
    textEdit->setText(mcin.readAll());
    file.close();
    return ;
}

//文件另存为
bool MainWindow::savefileas()
{
    QString filename = QFileDialog::getSaveFileName(this,tr("Svae File As"),curFile,tr("Text(*.txt)"));
    if(filename.isEmpty())
        return false;
    return savefile(filename);
}

//判断当前文件是否保存
bool MainWindow::maybesave()
{
    if(textEdit->document()->isModified())
    {
        QMessageBox box;
        box.setWindowTitle(tr("warning"));
        box.setIcon(QMessageBox::Warning);
        box.setText(curFile + tr(" 文件还未保存,是否保存?"));
        QPushButton *yesBtn = box.addButton(tr("yes(&Y)"),
                                            QMessageBox::YesRole);
        box.addButton(tr("no(&N)"),QMessageBox::NoRole);

        QPushButton *cancelBut = box.addButton(tr("calcel"),
                                               QMessageBox::RejectRole);
        box.exec();
        if(box.clickedButton() == yesBtn)
        {
           if(flag == 2)
                return save();
           else
                return savefileas();
        }
        else if(box.clickedButton() == cancelBut)
            return false;
    }
    return true;
}

//保存文件
bool MainWindow::save()
{
    if(textEdit->document()->isModified())
    {
        if(flag == 2)
        {
            QFile nowFile(curFile);
            nowFile.open(QFile::WriteOnly | QFile::Text);
            QTextStream out(&nowFile);
            out << textEdit->toPlainText();
            nowFile.close();
        }
        else
        {
            savefileas();
        }
    }
    return true;
}

bool MainWindow::savefile(const QString& filename)
{
    QFile file(filename);
    file.open(QFile::WriteOnly | QFile::Text);
    QTextStream out(&file);
    out << textEdit->toPlainText();
    file.close();
    return true;
}

//关闭程序的时候判断文件是否保存
void MainWindow::closeEditor()
{
    if(maybesave())
        this->close();
}

void MainWindow::Redo()
{
    textEdit->redo();
}

void MainWindow::Undo()
{
    textEdit->undo();
}

void MainWindow::Cut()
{
    textEdit->cut();
}

void MainWindow::Copy()
{
    textEdit->copy();
}

void MainWindow::Paste()
{
    textEdit->paste();
}

void MainWindow::setTextFont()
{
    bool ok;
    QFont font = QFontDialog::getFont(&ok,this);
    if(ok)
        textEdit->setFont(font);
}

void MainWindow::closeEvent(QCloseEvent *event)
{
    if(maybesave())
        event->accept();
    else
        event->ignore();
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值