Qt4系列之开发文本编辑器

2022-05-07 15:11:38 浏览数 (2)

代码语言:javascript复制
 mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H


#include <QMenu>
#include <QAction>
#include <QFont>
#include <QToolBar>
#include <QLabel>
#include <QComboBox>
#include <QLineEdit>
#include <QTextEdit>
#include <QPrinter>
#include <QVBoxLayout>
#include <QGridLayout>
#include <QActionGroup>
#include <QPrintDialog>
#include <QPushButton>
#include <QToolButton>
#include <QTextStream>
#include <QMessageBox>
#include <QTextCodec>
#include <QMainWindow>
#include <QFileDialog>
#include <QFontDialog>
#include <QInputDialog>
#include <QFontDatabase>
#include <QFontComboBox>
#include <QColorDialog>


namespace Ui {
class MainWindow;
}


class MainWindow : public QMainWindow
{
    Q_OBJECT


public:
    explicit MainWindow(QWidget *parent = 0);
    void createAction();
    void createMenu();
    void createToolBar();
    void fileRead();//读文件
    void fileWrite();//写文件
    ~MainWindow();


public:
    Ui::MainWindow *ui;
    QMenu *file;
    QMenu *edit;
    QMenu *style;
    QMenu *insert;//插入菜单
    QMenu *search;//查找菜单
    QMenu *help;//帮助菜单


    QToolBar *fileToolBar;
    QToolBar *editToolBar;
    QToolBar *styleToolBar;
    QToolBar *insertToolBar;
    QToolBar *searchToolBar;
    QToolBar *helpToolBar;


    QTextEdit *textEdit;


    QAction *newFile;
    QAction *openFile;
    QAction *save;
    QAction *saveAs;
    QAction *printText;
    QAction *exit;


    QAction *undoAction;//撤销
    QAction *redoAction;//恢复
    QAction *copy;
    QAction *cut;
    QAction *paste;


    QAction *insertImg;
    QAction *insertTable;


    QAction *find;


    QAction *about;
    QAction *aboutQt;


    QAction *bold;
    QAction *italic;
    QAction *underLine;
    QAction *color;


    QAction *left;
    QAction *center;
    QAction *right;
    QAction *justify;
    QActionGroup *group;




    QLabel *fontLabel;
    QLabel *fontSizeLabel;
    QFontComboBox *fontCom;
    QComboBox *fontSizeCom;


    QString fileName;


    QLineEdit *lineEdit;
    QLabel *label;
    QPushButton *btn;
    QVBoxLayout *layout;


    QLineEdit *column;
    QLineEdit *row;






private slots:
    void findNext();


    void NewFile();
    void OpenFile();
    void Save();
    void SaveAs();
    void Color();
    void Bold();
    void Italic();
    void UnderLine();
    void ALignment(QAction *);
    void PrintText();
    void InsertImage();
    void InsertTable();
    void mergeFormat(QTextCharFormat);
    void FontComBox(QString fontComStr);
    void FontSizeCom(QString fontSizeStr);
    void Find();
    void About();
    void AboutQt();
    void showCurrentCharFormatChanged(const QTextCharFormat &form);


};


#endif // MAINWINDOW_H
mainwindow.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
    setWindowIcon(QIcon(":/images/textEditor.png"));
    setWindowTitle(tr("Qt文本编辑器"));
    textEdit = new QTextEdit();
    setCentralWidget(textEdit);
    createAction();//创建动作
    createMenu();//创建菜单
    createToolBar();//创建工具栏


    //文件菜单的动作与槽的连接
    connect(newFile,SIGNAL(triggered()),this,SLOT(NewFile()));
    connect(openFile,SIGNAL(triggered()),this,SLOT(OpenFile()));
    connect(save,SIGNAL(triggered()),this,SLOT(Save()));
    connect(saveAs,SIGNAL(triggered()),this,SLOT(SaveAs()));
    connect(exit,SIGNAL(triggered()),this,SLOT(close()));
    //编辑菜单的动作与槽的连接
    connect(cut,SIGNAL(triggered()),textEdit,SLOT(cut()));
    connect(copy,SIGNAL(triggered()),textEdit,SLOT(copy()));
    connect(paste,SIGNAL(triggered()),textEdit,SLOT(paste()));
    connect(undoAction,SIGNAL(triggered()),textEdit,SLOT(undo()));
    connect(redoAction,SIGNAL(triggered()),textEdit,SLOT(redo()));
    //字体设置动作与槽的连接
    connect(fontCom,SIGNAL(activated(QString)),this,
            SLOT(FontComBox(QString)));
    //字号设置动作与槽的连接
    connect(fontSizeCom,SIGNAL(activated(QString)),this,SLOT(FontSizeCom(QString)));


    connect(textEdit,SIGNAL(currentCharFormatChanged(QTextCharFormat&)),
            this,SLOT(showCurrentCharFormatChanged(QTextCharFormat&)));




    //颜色编辑动作与槽的连接
    connect(color,SIGNAL(triggered()),this,SLOT(Color()));
    //格式菜单动作与槽的连接
    connect(bold,SIGNAL(triggered()),this,SLOT(Bold()));
    connect(italic,SIGNAL(triggered()),this,SLOT(Italic()));
    connect(underLine,SIGNAL(triggered()),this,SLOT(UnderLine()));


    connect(group,SIGNAL(triggered(QAction*)),this,SLOT(ALignment(QAction *)));
    //插入菜单动作与槽的连接
    connect(insertImg,SIGNAL(triggered()),this,SLOT(InsertImage()));
    connect(insertTable,SIGNAL(triggered()),this,SLOT(InsertTable()));
    //打印动作与槽的连接
    connect(printText,SIGNAL(triggered()),this,SLOT(PrintText()));
     //查找菜单动作与槽的连接
    connect(find,SIGNAL(triggered()),this,SLOT(Find()));


    connect(about,SIGNAL(triggered()),this,SLOT(About()));
    connect(aboutQt,SIGNAL(triggered()),this,SLOT(AboutQt()));
    resize(1000,600);
}






//创建动作


void MainWindow::createAction(){
    QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
    //新建文件
    newFile = new QAction(QIcon(":/images/new.png"),tr("新建文件"),this);
    newFile->setShortcut(tr("Ctrl N"));
    newFile->setStatusTip(tr("新建一个文件"));
    //打开文件
    openFile = new QAction(QIcon(":/images/open.png"),tr("打开文件"),this);
    openFile->setShortcut(tr("Ctrl O"));
    openFile->setStatusTip(tr("打开一个文件"));
    //保存文件
    save = new QAction(QIcon(":/images/save.png"),tr("保存"),this);
    save->setShortcut(tr("Ctrl S"));
    save->setStatusTip(tr("保存文件"));
    //另存为
    saveAs = new QAction(QIcon(":/images/saveAs.png"),tr("另存为"),this);
    saveAs->setShortcut(tr("Ctrl A"));
    saveAs->setStatusTip(tr("文件另存为"));
    //打印
    printText = new QAction(QIcon(":/images/printText.png"),tr("打印"),this);
    printText->setShortcut(tr("Ctrl P"));
    printText->setStatusTip(tr("打印"));
   //退出
    exit = new QAction(QIcon(":/images/exit.png"),tr("退出"),this);
    exit->setShortcut(tr("Ctrl E"));
    exit->setStatusTip(tr("退出"));
    //恢复
    redoAction = new QAction(QIcon(":/images/redo.png"),tr("恢复"),this);
    redoAction->setShortcut(tr("Ctrl R"));
    redoAction->setStatusTip(tr("恢复"));
    //撤销
    undoAction = new QAction(QIcon(":/images/undo.png"),tr("撤销"),this);
    undoAction->setShortcut(tr("Ctrl U"));
    undoAction->setStatusTip(tr("撤销"));
    //剪切
    cut = new QAction(QIcon(":/images/cut.png"),tr("剪切"),this);
    cut->setShortcut(tr("Ctrl X"));
    cut->setStatusTip(tr("剪切"));
    //复制
    copy = new QAction(QIcon(":/images/copy.png"),tr("复制"),this);
    copy->setShortcut(tr("Ctrl C"));
    copy->setStatusTip(tr("复制"));
   //粘贴
    paste = new QAction(QIcon(":/images/paste.png"),tr("黏贴"),this);
    paste->setShortcut(tr("Ctrl P"));
    paste->setStatusTip(tr("粘贴"));


     //粗体
    bold = new QAction(QIcon(":/images/bold.png"),tr("粗体"),this);
    bold->setStatusTip(tr("粗体字"));
    bold->setCheckable(true);
    //斜体
    italic = new QAction(QIcon(":/images/italic.png"),tr("斜体"),this);
    italic->setStatusTip(tr("斜体字"));
    italic->setCheckable(true);
    //下划线
    underLine = new QAction(QIcon(":/images/underline.png"),tr("下划线"),this);
    underLine->setStatusTip(tr("下划线"));
    underLine->setCheckable(true);
    //颜色
    color = new QAction(QIcon(":/images/color.png"),tr("颜色"),this);
    color->setShortcut(tr("Ctrl C"));
    color->setStatusTip(tr("颜色编辑"));


    group = new QActionGroup(this);
    //左对齐
    left = new QAction(QIcon(":/images/left.png"),tr("左对齐"),group);
    left->setStatusTip(tr("左对齐"));
    left->setCheckable(true);
    //居中
    center = new QAction(QIcon(":/images/center.png"),tr("居中对齐"),group);
    center->setStatusTip(tr("居中对齐"));
    center->setCheckable(true);
    //右对齐
    right = new QAction(QIcon(":/images/right.png"),tr("右对齐"),group);
    right->setStatusTip(tr("右对齐"));
    right->setCheckable(true);
    //两端对齐
    justify = new QAction(QIcon(":/images/justify.png"),tr("两端对齐"),group);
    justify->setStatusTip(tr("两端对齐"));
    justify->setCheckable(true);


    group->addAction(left);
    group->addAction(center);
    group->addAction(right);
    group->addAction(justify);
    //插入图片
    insertImg = new QAction(QIcon(":/images/image.png"),tr("插入图片"),this);
    insertImg->setStatusTip(tr("插入图片"));
    //插入表格
    insertTable = new QAction(QIcon(":/images/table.png"),tr("插入表格"),this);
    insertTable->setStatusTip(tr("插入表格"));
    //查找
    find = new QAction(QIcon(":/images/find.png"),tr("查找"),this);
    find->setShortcut(tr("Ctrl F"));
    find->setStatusTip(tr("查找"));
    //关于
    about = new QAction(QIcon(":/images/about.png"),tr("关于"),this);
    about->setStatusTip(tr("关于"));


    //字体
    fontLabel = new QLabel(tr("字体"));
    fontCom = new QFontComboBox();
    fontCom->setFontFilters(QFontComboBox::ScalableFonts);
    fontCom->setStatusTip(tr("字体设置"));
    //字号
    fontSizeLabel = new QLabel(tr("字号"));
    QFontDatabase db;
    fontSizeCom = new QComboBox();
    foreach(int size,db.standardSizes())
        fontSizeCom->addItem(QString::number(size));
    fontSizeCom->setStatusTip(tr("字号设置"));
    //关于
    aboutQt = new QAction(tr("关于QT"),this);
    aboutQt->setStatusTip(tr("关于Qt"));


}


//创建菜单
void MainWindow::createMenu(){
    //文件菜单
    file = menuBar()->addMenu(tr("文件(&F)"));
    file->addAction(newFile);
    file->addAction(openFile);
    file->addSeparator();
    file->addAction(save);
    file->addAction(saveAs);
    file->addSeparator();
    file->addAction(printText);
    file->addSeparator();
    file->addAction(exit);
    //编辑菜单
    edit = menuBar()->addMenu(tr("编辑(&E)"));
    edit->addAction(undoAction);
    edit->addAction(redoAction);
    edit->addSeparator();
    edit->addAction(cut);
    edit->addAction(copy);
    edit->addAction(paste);
    //插入菜单
    insert = menuBar()->addMenu(tr("插入(&I)"));
    insert->addAction(insertImg);
    insert->addAction(insertTable);
    //查找菜单
    search = menuBar()->addMenu(tr("查找(&F)"));
    search->addAction(find);
    //格式菜单


    style = menuBar()->addMenu(tr("格式(&S)"));
    style->addAction(bold);
    style->addAction(italic);
    style->addAction(underLine);
    style->addSeparator();
    style->addAction(color);
    style->addSeparator();
    style->addAction(left);
    style->addAction(center);
    style->addAction(right);
    style->addAction(justify);
    //帮助菜单
    help = menuBar()->addMenu(tr("帮助(&H)"));
    help->addAction(about);
    help->addAction(aboutQt);


}
//创建工具栏
void MainWindow::createToolBar(){
    //文件
    fileToolBar = addToolBar(tr("文件(&N)"));
    fileToolBar->addAction(newFile);
    fileToolBar->addAction(openFile);
    fileToolBar->addSeparator();


    fileToolBar->addAction(save);
    fileToolBar->addAction(saveAs);
    fileToolBar->addSeparator();


    fileToolBar->addAction(printText);
    fileToolBar->addSeparator();
    //编辑
    editToolBar = addToolBar(tr("编辑(&E)"));
    editToolBar->addAction(undoAction);
    editToolBar->addAction(redoAction);
    editToolBar->addSeparator();
    editToolBar->addAction(cut);
    editToolBar->addAction(copy);
    editToolBar->addAction(paste);
    //格式
    styleToolBar = addToolBar(tr("格式(&S)"));
    styleToolBar->addAction(bold);
    styleToolBar->addAction(italic);
    styleToolBar->addAction(underLine);
    styleToolBar->addSeparator();


    styleToolBar->addAction(left);
    styleToolBar->addAction(center);
    styleToolBar->addAction(right);
    styleToolBar->addAction(justify);
    styleToolBar->addSeparator();


    styleToolBar->addWidget(fontLabel);
    styleToolBar->addWidget(fontCom);
    styleToolBar->addWidget(fontSizeLabel);
    styleToolBar->addWidget(fontSizeCom);
    //插入
    insertToolBar = addToolBar(tr("插入(&I)"));
    insertToolBar->addAction(insertImg);
    insertToolBar->addAction(insertTable);
    insertToolBar->addSeparator();
    //查找
    searchToolBar = addToolBar(tr("查找(&F)"));
    searchToolBar->addAction(find);
    search->addSeparator();
}














//封装的读文件,用于精简程序
void MainWindow::fileRead(){
    QFile file(fileName);
    if(!file.open(QFile::ReadOnly|QFile::Text)){
         QMessageBox::warning(this,tr("多文档编辑器"),
                tr("不可以打开文件%1:n%2").arg(fileName).arg(file.errorString()));
         return;
    }
        QTextStream in(&file);
        QApplication::setOverrideCursor(Qt::WaitCursor);
        textEdit->setPlainText(in.readAll());
        QApplication::restoreOverrideCursor();
}
//封装的写文件,用于精简程序
void MainWindow::fileWrite(){
    QFile file(fileName);


    if(!file.open(QFile::WriteOnly|QFile::Text)){
        QMessageBox::warning(this,tr("多文档编辑器"),
                             tr("不可以写入文件%1:/n%2").arg(fileName).arg(file.errorString()));
        return;
    }


    QTextStream out(&file);
    QApplication::setOverrideCursor(Qt::WaitCursor);
    out<<textEdit->toPlainText();
    QApplication::restoreOverrideCursor();
    return;
}
//新建文件
void MainWindow::NewFile(){
    MainWindow *newEdit = new MainWindow;
    newEdit->show();
}
//打开文件
void MainWindow::OpenFile(){
    fileName = QFileDialog::getOpenFileName(this,tr("打开文件"),"/","allFile(*.*)");
    if(!fileName.isEmpty()){


        if(textEdit->document()->isEmpty()){
            fileRead();
        }else{
            MainWindow *newEdit = new MainWindow;
            newEdit->show();
            QFile file(fileName);
            if(!file.open(QFile::ReadOnly|QFile::Text)){
                 QMessageBox::warning(this,tr("多文档编辑器"),
                        tr("不可以打开文件%1:n%2").arg(fileName).arg(file.errorString()));
                 return;
            }
                QTextStream in(&file);
                QApplication::setOverrideCursor(Qt::WaitCursor);
                newEdit->textEdit->setPlainText(in.readAll());
                QApplication::restoreOverrideCursor();




        }


    }
}
//保存文件
void MainWindow::Save(){


    if(fileName.isEmpty()){
       fileName = QFileDialog::getSaveFileName(this,tr("另存为"),tr("未命名.txt"));
       fileWrite();
    }else{
        fileWrite();
    }


}
//另存为
void MainWindow::SaveAs(){


    fileName = QFileDialog::getSaveFileName(this,tr("另存为"),tr("未命名.txt"));
    fileWrite();
}
















//字体设置
void MainWindow::FontComBox(QString fontComStr){
    QTextCharFormat format;
    format.setFontFamily(fontComStr);
    mergeFormat(format);
}
void MainWindow::mergeFormat(QTextCharFormat format){
    QTextCursor cursor = textEdit->textCursor();
    if(!cursor.hasSelection())
       cursor.select(QTextCursor::WordUnderCursor);
       cursor.mergeCharFormat(format);
       textEdit->mergeCurrentCharFormat(format);


}
//字号设置
void MainWindow::FontSizeCom(QString fontSizeStr){
    QTextCharFormat format;
    format.setFontPointSize(fontSizeStr.toFloat());
    textEdit->mergeCurrentCharFormat(format);
}










//颜色设置
void MainWindow::Color(){
    QColor color = QColorDialog::getColor(Qt::blue,this);
    if(color.isValid()){
        QTextCharFormat format;
        format.setForeground(color);
        textEdit->mergeCurrentCharFormat(format);
    }
}
//粗体
void MainWindow::Bold(){
    QTextCharFormat format;
    format.setFontWeight(bold->isChecked()?QFont::Bold:QFont::Normal);
    textEdit->mergeCurrentCharFormat(format);
}
//斜体
void MainWindow::Italic(){
    QTextCharFormat format;
    format.setFontItalic(italic->isChecked());
    textEdit->mergeCurrentCharFormat(format);


}
//下划线
void MainWindow::UnderLine(){


    QTextCharFormat format;
    format.setFontUnderline(underLine->isChecked());
    textEdit->mergeCurrentCharFormat(format);
}
//对齐
void MainWindow::ALignment(QAction *act){
    if(act == left){
        textEdit->setAlignment(Qt::AlignLeft);
    }else if(act == center){
        textEdit->setAlignment(Qt::AlignCenter);
    }else if(act == right){
        textEdit->setAlignment(Qt::AlignRight);
    }else if(act == justify){
        textEdit->setAlignment(Qt::AlignJustify);
    }


}










//插入图片
void MainWindow::InsertImage(){


    QTextCursor cursor = textEdit->textCursor();
    QTextImageFormat format;
    QString image = QFileDialog::getOpenFileName(this,"insert image","/","png(*.png)");
    format.setName(image);
    cursor.insertImage(format);


}


//插入表格,用到输入对话框
void MainWindow::InsertTable(){
    bool ok;
    int a = QInputDialog::getInt(this,tr("插入表格"),tr("输入行数:"),0,0,300,1,&ok);
    int b = QInputDialog::getInt(this,tr("插入表格"),tr("输入列数:"),0,0,300,1,&ok);
    if(ok){


        QTextCursor cursor = textEdit->textCursor();


        QTextTableFormat format;
        format.setCellSpacing(0);
        format.setCellPadding(30);


        cursor.insertTable(a,b,format);


    }
}




//查找
void MainWindow::Find(){
    QDialog *dialog = new QDialog(this);
    dialog->setWindowTitle(tr("查找"));
    lineEdit = new QLineEdit(dialog);
    label = new QLabel(this);
    btn = new QPushButton(dialog);
    btn->setText(tr("下一个"));
    connect(btn,SIGNAL(clicked()),this,SLOT(findNext()));


    layout = new QVBoxLayout();
    layout->addWidget(lineEdit);
    layout->addWidget(btn);
    dialog->setLayout(layout);
    dialog->resize(60,60);
    dialog->show();


}


void MainWindow::findNext(){


    QString str = lineEdit->text();


    bool isfind = textEdit->find(str,QTextDocument::FindBackward);


    if(isfind){
        label->setText(tr("查找目标在,行号:%1 列号:%2!").arg(textEdit->textCursor().blockNumber()).arg(textEdit->textCursor().columnNumber()));
        ui->statusBar->addPermanentWidget(label);
    }


}
//打印
void MainWindow::PrintText(){
    QPrinter printer;
    QPrintDialog printDialog(&printer,this);
    if(printDialog.exec()){
        QTextDocument *textDocument = textEdit->document();
        textDocument->print(&printer);
    }
}














//帮助


void MainWindow::About(){
    QMessageBox::about(this,tr("关于"),tr("这是一个文本编辑器"));


}


void MainWindow::AboutQt(){
    QMessageBox::aboutQt(this,tr("Qt编辑器"));
}


void MainWindow::showCurrentCharFormatChanged(const QTextCharFormat &form){


    fontCom->setCurrentIndex(fontCom->findText(form.fontFamily()));
    fontSizeCom->setCurrentIndex(fontSizeCom->findText(QString::number(form.fontPointSize())));
    bold->setChecked(form.font().bold());
    italic->setChecked(form.font().italic());
    underLine->setChecked(form.font().underline());
}


MainWindow::~MainWindow()
{
    delete ui;
}


 main.cpp:
#include <QApplication>
#include "mainwindow.h"


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

0 人点赞