zoukankan      html  css  js  c++  java
  • C++ GUI Qt4编写的文本编辑器

    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);
    
    };


    mainwindow.cpp:

    #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:
    %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:
    %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();
    }
  • 相关阅读:
    获得H.264视频分辨率的方法
    学习Mathematica
    关于LaTeX公式排版
    关于Jordan标准形
    关于surface gradient
    Jacobi-Anger expansion
    两个1/x类的广义函数
    积分计算相关内容
    关于multi-index
    关于$mathcal{D}(0,1)$上的一个有趣结论
  • 原文地址:https://www.cnblogs.com/mzq123/p/4982656.html
Copyright © 2011-2022 走看看