QT 多文档文本编辑器

在这里插入图片描述
在这里插入图片描述

一、设计目标

设计开发一个简单的多文档文本编辑器,具有新建、打开、保存一个文件、另存为一个文件、设置字体、设置字号、跨子窗口的剪切、复制、粘贴、查找、加粗、倾斜、下划线、设置字体颜色、左对齐、居中、右对齐、撤销、重做、窗口层叠、窗口平铺等功能。

二、设计思路

使用MainWindows类,创建一个主窗口,并且具有菜单栏和工具栏。使用MdiArea作为主窗口文件编辑的主要显示界面。自定义类childedit继承QTextEdit类,并且添加了保存为txt文件、打开txt文件并且读取到当前窗口中的功能。使用childedit类的对象作为子窗口添加到MdiArea中,并在其中对字体等进行各种各样的操作。
新建直接new创建一个childedit对象添加到MdiArea中。打开是使用QFile的对象通过getOpenFileName函数调用系统文件对话框,并且返回绝对路径给QFile对象。使用文件流将内容读取出来。保存和另存为也类似。
设置字体、颜色、字号、加粗、下划线、倾斜等功能均使用QTextCharFormat 对象获取字体格式,并且使用mergeCurrentCharFormat函数设置当前选中的文字的字体格式。

三、源代码

mainwindows.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include<QFontComboBox>
#include<QToolButton>
#include<QTextEdit>
#include<QMdiSubWindow>
#include"childedit.h"
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT
    bool is_saved;
    bool is_MDI;
    bool Boldcheck;
    bool Italiccheck;
    bool UnderLinecheck;
    int childNumber;
    QDialog *newDialog;
    QLineEdit *line;
    QToolButton *undo;
    QToolButton *redo;

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    childEdit *activeEdit();

private:
    Ui::MainWindow *ui;
public slots:
    void Newfile();
    void Openfile();
    void Save();
    void Savefile(QString);
    void SaveAs();
    void Setfont(QString);
    void SetfontSize(int);
    void Font_Bold();
    void Font_Underline();
    void Font_Italic();
    void Setcolor();
    void Set_center();
    void Set_left();
    void Set_right();
    void Setfontfamily();
    void Search();
    void Find_text();
    void actionCascade();
    void actionTile();
    void actionMDI();
    void actionPrevious();
    void actionNext();
    void cut();
    void copy();
    void paste();
    void Undo();
    void Redo();
    void Close();
    void CloseAll();

};
#endif // MAINWINDOW_H

mainwindows.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include"childwindows.h"
#include<QFile>
#include<QFileDialog>
#include<QTextStream>
#include<QMessageBox>
#include<QFontDialog>
#include<QFont>
#include<QFontComboBox>
#include<QSpinBox>
#include<QLabel>
#include<QTextCharFormat>
#include<QToolButton>
#include<QPushButton>
#include<QColorDialog>
#include<QLineEdit>
#include<QTextEdit>
#include<QHBoxLayout>
#include<QSignalMapper>
#include<QMdiArea>
#include<QMdiSubWindow>
#include<QDebug>
#include"childedit.h"
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    is_saved = false;
    is_MDI = true;
    Boldcheck = true;
    Italiccheck = true;
    UnderLinecheck = true;
    childNumber = 0;

    line = new QLineEdit(this);
    QPushButton *btn = new QPushButton(this);
    QHBoxLayout *layout = new QHBoxLayout(this);
    newDialog =new QDialog(this);
    btn->setText("搜索下一个");
    layout->addWidget(line);
    layout->addWidget(btn);
    newDialog->setLayout(layout);
    newDialog->setWindowTitle("查找");

    QFontComboBox *fontbox = new QFontComboBox(this);
    QSpinBox *fontsize = new QSpinBox(this);
    QToolButton *btn_Bold = new QToolButton(this);
    QToolButton *btn_Underline = new QToolButton(this);
    QToolButton *btn_Italic = new QToolButton(this);
    QToolButton *color = new QToolButton(this);
    QToolButton *center = new QToolButton(this);
    QToolButton *left = new QToolButton(this);
    QToolButton *right = new QToolButton(this);
    undo = new QToolButton(this);
    redo = new QToolButton(this);
    fontbox->setMinimumWidth(120);
    fontsize->setValue(13);

    btn_Bold->setText("加粗");
    btn_Underline->setText("下划线");
    btn_Italic->setText("倾斜");
    color->setText("颜色");
    center->setText("居中");
    left->setText("左对齐");
    right->setText("右对齐");
    undo->setText("撤销");
    redo->setText("重做");
    ui->actioncut->setShortcut(tr("Ctrl+X"));
    ui->actioncopy->setShortcut(tr("Ctrl+C"));
    ui->actionpaste->setShortcut(tr("Ctrl+V"));
    ui->actionsearch->setShortcut(tr("Ctrl+F"));
    ui->actionsave->setShortcut(tr("Ctrl+S"));

    ui->toolBar->addWidget(fontbox);
    ui->toolBar->addWidget(fontsize);
    ui->toolBar->addWidget(btn_Bold);
    ui->toolBar->addWidget(btn_Italic);
    ui->toolBar->addWidget(btn_Underline);
    ui->toolBar->addWidget(color);
    ui->toolBar->addWidget(left);
    ui->toolBar->addWidget(center);
    ui->toolBar->addWidget(right);
    ui->toolBar->addWidget(undo);
    ui->toolBar->addWidget(redo);

    ui->actionnew->setIcon(QIcon(":/res/xinjian.png"));
    ui->actionopen->setIcon(QIcon(":/res/dakai.png"));
    ui->actionsave->setIcon(QIcon(":/res/baocun.png"));
    btn_Bold->setIcon(QIcon(":/res/jiacu.png"));
    btn_Italic->setIcon(QIcon(":/res/xieti.png"));
    btn_Underline->setIcon(QIcon(":/res/xiahuaxian.png"));
    color->setIcon(QIcon(":/res/color.png"));
    ui->actioncut->setIcon(QIcon(":/res/jianqie.png"));
    ui->actioncopy->setIcon(QIcon(":/res/fuzhi.png"));
    ui->actionpaste->setIcon(QIcon(":/res/zhangtie.png"));
    ui->actionsearch->setIcon(QIcon(":/res/chazhao.jpg"));
    undo->setIcon(QIcon(":/res/chexiao.png"));
    redo->setIcon(QIcon(":/res/chongzuo.png"));
    left->setIcon(QIcon(":/res/left.png"));
    center->setIcon(QIcon(":/res/center.png"));
    right->setIcon(QIcon(":/res/right.png"));

    ui->mdiArea->setViewMode(QMdiArea::TabbedView);

    connect(ui->actionnew,SIGNAL(triggered()),this,SLOT(Newfile()));
    connect(ui->actionopen,SIGNAL(triggered()),this,SLOT(Openfile()));
    connect(ui->actionsave,SIGNAL(triggered()),this,SLOT(Save()));
    connect(ui->actionSaveas,SIGNAL(triggered()),this,SLOT(SaveAs()));
    connect(fontbox,SIGNAL(currentIndexChanged(QString)),this,SLOT(Setfont(QString)));
    connect(fontsize,SIGNAL(valueChanged(int)),this,SLOT(SetfontSize(int)));
    connect(btn_Bold,SIGNAL(clicked()),this,SLOT(Font_Bold()));
    connect(btn_Underline,SIGNAL(clicked()),this,SLOT(Font_Underline()));
    connect(btn_Italic,SIGNAL(clicked()),this,SLOT(Font_Italic()));
    connect(color,SIGNAL(clicked()),this,SLOT(Setcolor()));
    connect(center,SIGNAL(clicked()),this,SLOT(Set_center()));
    connect(left,SIGNAL(clicked()),this,SLOT(Set_left()));
    connect(right,SIGNAL(clicked()),this,SLOT(Set_right()));
    connect(undo,SIGNAL(clicked()),this,SLOT(Undo()));
    connect(redo,SIGNAL(clicked()),this,SLOT(Redo()));

    connect(ui->actioncut,SIGNAL(triggered()),this,SLOT(cut()));
    connect(ui->actioncopy,SIGNAL(triggered()),this,SLOT(copy()));
    connect(ui->actionpaste,SIGNAL(triggered()),this,SLOT(paste()));
    connect(ui->actioncolor,SIGNAL(triggered()),this,SLOT(Setcolor()));
    connect(ui->actionfont,SIGNAL(triggered()),this,SLOT(Setfontfamily()));
    connect(ui->actionsearch,SIGNAL(triggered()),this,SLOT(Search()));
    connect(btn,SIGNAL(clicked()),this,SLOT(Find_text()));

    connect(ui->actionclose,SIGNAL(triggered()),this,SLOT(Close()));
    connect(ui->actioncloseAll,SIGNAL(triggered()),this,SLOT(CloseAll()));
    connect(ui->actioncascade,SIGNAL(triggered()),this,SLOT(actionCascade()));
    connect(ui->actiontile,SIGNAL(triggered()),this,SLOT(actionTile()));
    connect(ui->actionmdi,SIGNAL(triggered()),this,SLOT(actionMDI()));
    connect(ui->actionprevious,SIGNAL(triggered()),this,SLOT(actionPrevious()));
    connect(ui->actionnext,SIGNAL(triggered()),this,SLOT(actionNext()));

}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::Newfile()  //打开新窗口
{
    childEdit *edit = new childEdit(this);
    ui->mdiArea->addSubWindow(edit);
    edit->setFontPointSize(13);
    childNumber++;
    edit->setWindowTitle(tr("%1 未保存文件").arg(childNumber));
    edit->show();
}
void MainWindow::Openfile()     //打开文件
{
    Newfile();
    activeEdit()->OpenFile();
}
void MainWindow::Save()     //判断是否保存过文件
{
    activeEdit()->Save();
}
void MainWindow::SaveAs()   //另存为文件
{
    activeEdit()->SaveAs();
}
void MainWindow::Savefile(QString filename)     //保存文件
{
    QFile file(filename);
    file.open(QFile::WriteOnly | QFile::Text);
    QTextStream out(&file);
    out << activeEdit()->toPlainText();
}
void MainWindow::Setfont(QString fontStr)   //工具栏设置字体
{
    QTextCharFormat format;
    format.setFontFamily(fontStr);
    activeEdit()->mergeCurrentCharFormat(format);
}
void MainWindow::Setfontfamily()    //编辑框设置字体
{
    bool ifok;
    QFont font = QFontDialog::getFont(&ifok,this);
    QTextCharFormat format;
    format.setFont(font);
    activeEdit()->mergeCurrentCharFormat(format);
}
void MainWindow::SetfontSize(int FontSize)  //设置字号
{
    QTextCharFormat format;
    format.setFontPointSize(FontSize);
    activeEdit()->mergeCurrentCharFormat(format);
}
void MainWindow::Font_Bold()	//设置粗体
{
    QTextCharFormat format;
    format.setFontWeight(Boldcheck ? QFont::Bold : QFont::Normal);
    activeEdit()->mergeCurrentCharFormat(format);
    Boldcheck = !Boldcheck;
}
void MainWindow::Font_Underline()	//设置下划线
{
    QTextCharFormat format;
    format.setFontUnderline(UnderLinecheck);
    activeEdit()->mergeCurrentCharFormat(format);
    UnderLinecheck = !UnderLinecheck;
}
void MainWindow::Font_Italic()	//设置倾斜
{
    QTextCharFormat format;
    format.setFontItalic(Italiccheck);
    activeEdit()->mergeCurrentCharFormat(format);
    Italiccheck = !Italiccheck;
}
void MainWindow::Setcolor()	//设置颜色
{
    QColor color = QColorDialog::getColor(Qt::red, this);
    QTextCharFormat format;
    format.setForeground(color);
    activeEdit()->mergeCurrentCharFormat(format);
}
void MainWindow::Set_center()	//居中
{
    activeEdit()->setAlignment(Qt::AlignCenter);
}
void MainWindow::Set_left()		//左对齐
{
    activeEdit()->setAlignment(Qt::AlignLeft);
}
void MainWindow::Set_right()	//右对齐
{
    activeEdit()->setAlignment(Qt::AlignRight);
}
void MainWindow::Search()	//搜索
{
    newDialog->show();
}
void MainWindow::Find_text()
{
    QString findtext=line->text();
    if(activeEdit()->find(findtext,QTextDocument::FindBackward))
    {
        QPalette palette = activeEdit()->palette();
        palette.setColor(QPalette::Highlight,palette.color(QPalette::Active,QPalette::Highlight));
        activeEdit()->setPalette(palette);
    }
    else
    {
        QMessageBox::information(this,tr("注意"),tr("没有找到内容"),QMessageBox::Ok);
    }
}
childEdit *MainWindow::activeEdit()		//返回当前活动窗口指针
{
    if(QMdiSubWindow * window = ui->mdiArea->activeSubWindow()){
        return qobject_cast<childEdit *>(window->widget());
    }
    return 0;
}
void MainWindow::actionCascade()	//窗口层叠
{
    ui->mdiArea->cascadeSubWindows();
}
void MainWindow::actionTile()	//窗口平铺
{
    ui->mdiArea->tileSubWindows();
}
void MainWindow::actionMDI()
{
    if(is_MDI){
        ui->mdiArea->setViewMode(QMdiArea::SubWindowView);
        is_MDI = false;
    }
    else{
        ui->mdiArea->setViewMode(QMdiArea::TabbedView);
        is_MDI = true;
    }
}
void MainWindow::actionPrevious()
{
    ui->mdiArea->activatePreviousSubWindow();
}
void MainWindow::actionNext()
{
    ui->mdiArea->activateNextSubWindow();
}
void MainWindow::cut()
{
    if(activeEdit()){
        activeEdit()->cut();
    }
}
void MainWindow::copy()
{
    if(activeEdit()){
        activeEdit()->copy();
    }
}
void MainWindow::paste()
{
    if(activeEdit()){
        activeEdit()->paste();
    }
}
void MainWindow::Undo()		//撤销
{
    if(activeEdit()){
        activeEdit()->undo();
    }
}
void MainWindow::Redo()		//重做
{
    if(activeEdit()){
        activeEdit()->redo();
    }
}
void MainWindow::Close()
{
    ui->mdiArea->closeActiveSubWindow();
}
void MainWindow::CloseAll()
{
    ui->mdiArea->closeAllSubWindows();
}

childedit.h

#ifndef CHILDEDIT_H
#define CHILDEDIT_H

#include <QTextEdit>

class childEdit : public QTextEdit
{
    Q_OBJECT
public:
    explicit childEdit(QWidget *parent = nullptr);
    bool is_saved;
    QString lastfile;

    void OpenFile();
    void Save();
    void Loadfile(QString);
    void SaveAs();
    void Savefile(QString);

signals:

};

#endif // CHILDEDIT_H

childedit.cpp

#include "childedit.h"
#include<QFileDialog>
#include<QTextStream>
#include<QTextEdit>
childEdit::childEdit(QWidget *parent) : QTextEdit(parent)
{
    setAttribute(Qt::WA_DeleteOnClose);
}
void childEdit::OpenFile()	//打开文件
{
    QString filename = QFileDialog::getOpenFileName(this,tr("文件打开"),"D:/Downloads",tr("*.*"));
    if(!filename.isEmpty()){
        Loadfile(filename);
        setWindowTitle(filename);
    }
}
void childEdit::Save()	//保存文件
{
    if(!is_saved){
        lastfile = QFileDialog::getSaveFileName(this,tr("文件保存"),"D:/Downloads",tr("TextFiles(*.txt)"));
        is_saved = true;
        setWindowTitle(lastfile);
        Savefile(lastfile);
    }
    else{
        Savefile(lastfile);
    }
}
void childEdit::Loadfile(QString filename)	//加载文件
{
    QFile file(filename);
    file.open(QIODevice::ReadOnly | QIODevice::Text);
    QTextStream in(&file);
    in.setCodec("utf-8");
    setPlainText(in.readAll());
}
void childEdit::SaveAs()
{
    QString filename = QFileDialog::getSaveFileName(this,tr("file open"),"D:/Downloads",tr("TextFiles(*.txt)"));
    Savefile(filename);
}
void childEdit::Savefile(QString filename)
{
    QFile file(filename);
    file.open(QFile::WriteOnly | QFile::Text);
    QTextStream out(&file);
    out.setCodec("utf-8");
    out <<toPlainText();
}

四、源代码下载

下载链接

  • 3
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值