精华内容
下载资源
问答
  • Qt5——主窗口

    千次阅读 2020-03-07 19:25:29
    文章目录Qt5 主窗口构成基本元素示例:文本编辑器示例步骤及代码 Qt5 主窗口构成 基本元素 QMainWindow是一个为用户提供主窗口程序的类,包含一个菜单栏(menu bar)、多个工具栏(tool bars)、多个锚接部件(dock...


    Qt5 主窗口构成

    基本元素

    QMainWindow是一个为用户提供主窗口程序的类,包含一个菜单栏(menu bar)、多个工具栏(tool bars)、多个锚接部件(dock widgets)及一个中心部件(central widget),是许多应用程序的基础,如文本编辑器、图片编辑器等。
    接下来将详细介绍关于这些的基本元素

    • 菜单栏
      菜单是一系列命令的列表。为了实现菜单、工具栏按钮、键盘快捷方式等命令的一致性,Qt使用动作(Action)来表示这些命令。Qt的菜单就是由一系列的QAction动作对象构成的列表,而菜单栏则是包容菜单的面板,它位于主窗口顶部、主窗口标题栏的下面。一个主窗口最多只有一个菜单栏。

    • 状态栏
      状态栏通常显示GUI应用程序的一些状态信息,它位于主窗口的底部。用户可以在状态栏上添加、使用Qt窗口部件。一个主窗口最多只能有一个状态栏。

    • 工具栏
      工具栏是由一系列的类似于按钮的动作排列而成的面板,它通常由一些经常使用的命令(动作)组成。工具栏位于菜单栏的下面、状态栏的上面,可以停靠在主窗口的上、下、左、右四个方向上。一个主窗口可以包含多个工具栏。

    • 锚接部件
      锚接部件作为一个容器使用,以包容其他窗口部件来实现某些功能。例如:Qt设计器的属性编辑器、对象监视器等都是由锚接部件包容其他的Qt窗口部件来实现的。它位于工具栏区的内部,可以作为一个窗口自由浮动在主窗口上面,也可以像工具栏一样停靠在主窗口的上、下、左、右四个方向上。一个主窗口可以包含多个锚接部件。

    • 中心部件
      中心部件处于锚接部件区的内部、主窗口的中心。一个主窗口只有一个中心部件。

      • 注:主窗口QMainWindow具有自己的布局管理器,因此在QMainWindow窗口上设置布局管理器或者创建一个父窗口部件作为QMainWindow的布局管理器都是不允许的。但可以在主窗口的中心部件上设置管理器。

    示例:文本编辑器

    接下来通过完成一个文本编辑器应用实例,来介绍关于QMainWindow主窗体的创建流程核各种功能的开发。

    首先,极少文件操作功能,包括新建一个文件,理由标准文件对话框QFileDialog类打开一个已存在的文件,利用QFile和QTextStream读取文件内容,打印文件(分文本打印和图像打印)。通过示例介绍标准打印对话框QPrintDialog类的使用方法,以QPrinter作为QPaintDevice画图实现图像打印。

    接着,介绍图像处理软件中的常用功能,包括图片的缩放、旋转及镜像等坐标变换,使用QMatrix实现图像的各种坐标变换。

    然后,开发文本编辑功能,通过在工具栏上设置文字字体、字号大小、加粗、斜体、下划线及字体颜色等快捷按钮的实现,介绍了在工具栏中嵌入控件的方法。其中,通过设置字体颜色功能,介绍了标准颜色对话框QColorDialog类的使用方法。

    最后是排版功能,通过选择某种排序方式实现对文本排序,以及实现文本对齐(包括左对齐、右对齐、居中对齐和两端对齐)和撤销、重做的方法。

    示例步骤及代码

    首先简历项目的框架代码:

    • 新建Qt Widgets Application项目,项目名称为“ImageProcessor”,基类选择“QMainWindow”,类名命名为“ImgProcessor”,取消“创建界面”复选框的选中状态。完成项目工程的建立。
    • 添加工程的提供主要显示文本编辑框函数所在的文件,点击右键添加新文件,选择“C++Class”选项,选择基类名“QWidget”,类命名为“ShowWidget”,在源文件和头文件添加以下代码:
    • showwidget.h
    #ifndef SHOWWIDGET_H
    #define SHOWWIDGET_H
    
    #include <QWidget>
    #include <QLabel>
    #include <QTextEdit>
    #include <QImage>
    
    class ShowWidget : public QWidget
    {
        Q_OBJECT
    public:
        explicit ShowWidget(QWidget *parent = nullptr);
    
        QImage img;
        QLabel *imageLabel;
        QTextEdit *text;
    
    signals:
    public slots:
    
    };
    
    #endif // SHOWWIDGET_H
    
    
    • showwidget.cpp
    #include "showwidget.h"
    #include<QHBoxLayout>
    
    ShowWidget::ShowWidget(QWidget *parent) : QWidget(parent)
    {
        imageLabel = new QLabel;
        imageLabel->setScaledContents(true);
        text = new QTextEdit;
        QHBoxLayout *mainLayout = new QHBoxLayout(this);
        mainLayout->addWidget(imageLabel);
        mainLayout->addWidget(text);
    }
    
    
    • 主函数 ImgProcessor 类声明中,createActions() 函数用于创建所有的动作,createMenus() 函数用于创建菜单、createToolBars() 函数用于创建工具栏;接着声明实现主窗口所需的各个元素,包括菜单、工具栏及各个动作等;最后声明用到的槽函数,打开“imgprocessor.h”文件,添加以下代码:
    #ifndef IMGPROCESSOR_H
    #define IMGPROCESSOR_H
    
    #include <QMainWindow>
    #include <QImage>
    #include <QLabel>
    #include <QMenu>
    #include <QMenuBar>
    #include <QAction>
    #include <QComboBox>
    #include <QSpinBox>
    #include <QToolBar>
    #include <QFontComboBox>
    #include <QToolButton>
    #include <QTextCharFormat>
    #include "showwidget.h"
    
    class ImgProcessor : public QMainWindow
    {
        Q_OBJECT
    
    public:
        ImgProcessor(QWidget *parent = nullptr);
        ~ImgProcessor();
    
        void createActions();
        void createMenus();
        void createToolBars();
        void loadFile(QString filename);
        void mergeFormat(QTextCharFormat);
    
    private:
        QMenu *fileMenu;
        QMenu *zoomMenu;
        QMenu *rotateMenu;
        QMenu *mirrorMenu;
        QImage img;
        QString fileName;
    
        ShowWidget *showWidget; //文件菜单项
        QAction *openFileAction;
        QAction *NewFileAction;
        QAction *printTRextAction;
        QAction *printImageAction;
        QAction *exitAction;
        QAction *copyAction;    //编辑菜单项
        QAction *cutAction;
        QAction *pasteAction;
        QAction *aboutAction;
        QAction *zoomInAction;
        QAction *zoomOutAction;
        QAction *rotate90Action;    //旋转菜单项
        QAction *rotate180Action;
        QAction *rotate270Action;
        QAction *mirrorVerticalAction;  //镜像菜单项
        QAction *mirrorHorizontalAction;
        QAction *undoAction;
        QAction *redoAction;
        QToolBar *fileTool; //工具栏
        QToolBar *zoomTool;
        QToolBar *rotateTool;
        QToolBar *mirrorTool;
        QToolBar *doToolBar;
    };
    #endif // IMGPROCESSOR_H
    
    
    • 下面是主窗口的部分代码:
    #include "imgprocessor.h"
    
    ImgProcessor::ImgProcessor(QWidget *parent)
        : QMainWindow(parent)
    {
        setWindowTitle(tr("Easy Word"));    //窗口标题
    
        showWidget = new ShowWidget(this);
        setCentralWidget(showWidget);
    
        //创建动作、菜单、工具栏
        createActions();
        createMenus();
        createToolBars();
    
        if(img.load("mage.png"))
        {
            //在imagelabel中放置图像
            showWidget->imageLabel->setPixmap(QPixmap::fromImage(img));
        }
    }
    
    ImgProcessor::~ImgProcessor()
    {
    }
    
    void ImgProcessor::createActions()
    {
        //“打开”动作
        openFileAction = new QAction(QIcon("open.png"), tr("打开"), this);
        openFileAction->setShortcut(tr("Ctrl+O"));	//设置此动作的组合键
        openFileAction->setStatusTip(tr("打开一个文件"));//设定状态栏显示。
    
        //“新建”动作
        NewFileAction = new QAction(QIcon("new.png"), tr("新建"), this);
        NewFileAction->setShortcut(tr("Ctrl+N"));
        NewFileAction->setStatusTip(tr("新建一个文件"));
    
        //“退出”动作
        exitAction = new QAction(tr("退出"), this);
        exitAction->setShortcut(tr("Ctrl+Q"));
        exitAction->setStatusTip(tr("退出程序"));
        connect(exitAction, SIGNAL(triggered()), this, SLOT(close()));
    
        //“复制”动作
        copyAction = new QAction(QIcon("copy.png"), tr("复制"), this);
        copyAction->setShortcut(tr("Ctrl+C"));
        copyAction->setStatusTip(tr("复制文件"));
        connect(copyAction, SIGNAL(triggered()), showWidget->text, SLOT(copy()));
    
        //“剪切”动作
        cutAction = new QAction(QIcon("cut.png"), tr("剪切"), this);
        cutAction->setShortcut(tr("Ctrl+X"));
        cutAction->setStatusTip(tr("剪切文件"));
        connect(cutAction, SIGNAL(truggered()), showWidget->text, SLOT(cut()));
    
        //“粘贴”动作
        pasteAction = new QAction(QIcon("paste.png"), tr("粘贴"), this);
        pasteAction->setShortcut(tr("Ctrl+V"));
        pasteAction->setStatusTip(tr("粘贴文件"));
        connect(pasteAction, SIGNAL(triggered()), showWidget->text, SLOT(paste()));
    
        //“关于”动作
        aboutAction = new QAction(tr("关于"), this);
        connect(aboutAction, SIGNAL(triggered()), this, SLOT(QApplication::aboutQt()));
    
        //“打印文本”动作
        printTRextAction = new QAction(QIcon("printText.png"), tr("打印文本"), this);
        printTRextAction->setStatusTip(tr("打印一个文本"));
    
    
        //“打印图像”动作
        printImageAction = new QAction(QIcon("printImage.png"), tr("打印图像"), this);
        printImageAction->setStatusTip(tr("打印一幅图像"));
    
        //“放大”动作
        zoomInAction = new QAction(QIcon("zoomin.png"), tr("放大"), this);
        zoomInAction->setStatusTip(tr("放大一张照片"));
    
        //“缩小”动作
        zoomOutAction = new QAction(QIcon("zoomout.png"), tr("缩小"), this);
        zoomOutAction->setStatusTip(tr("缩小一张照片"));
    
        //实现图像旋转的动作
        //90
        rotate90Action = new QAction(QIcon("rotate90.png"), tr("旋转90"), this);
        rotate90Action->setStatusTip(tr("将一幅图像旋转90度"));
        //180
        rotate180Action = new QAction(QIcon("rotate180.png"), tr("旋转180"), this);
        rotate180Action->setStatusTip(tr("将一幅图像旋转180度"));
        //270
        rotate270Action = new QAction(QIcon("rotate270.png"), tr("旋转270"), this);
        rotate270Action->setStatusTip(tr("将一副图像旋转270度"));
    
        //实现图像镜像的动作
        //纵向
        mirrorVerticalAction = new QAction(QIcon("mirrorV.png"), tr("纵向镜像"), this);
        mirrorVerticalAction->setStatusTip(tr("对一幅图像纵向镜像"));
    
        //横向
        mirrorHorizontalAction = new QAction(QIcon("mirrorH.png"), tr("横向镜像"), this);
        mirrorHorizontalAction->setStatusTip(tr("对一副图像横向镜像"));
    
        //实现撤销和恢复动作
        undoAction = new QAction(QIcon("undo.png"), tr("撤销"), this);
        connect(undoAction, SIGNAL(triggered()), showWidget->text, SLOT(undo()));
    
        redoAction = new QAction(QIcon("redo.png"), tr("重做"), this);
        connect(redoAction, SIGNAL(triggered()), showWidget->text, SLOT(redo()));
    }
    
    void ImgProcessor::createMenus()
    {
        //文件菜单
        fileMenu = menuBar()->addMenu(tr("文件"));	//menuBar()得到主窗口的菜单栏指针,调用函数addMenu()插入一个新的菜单。
        fileMenu->addAction(openFileAction);//调用addAction()函数向菜单中加入菜单条目
        fileMenu->addAction(NewFileAction);
        fileMenu->addAction(printTRextAction);
        fileMenu->addAction(printImageAction);
        fileMenu->addSeparator();//插入空格
        fileMenu->addAction(exitAction);
    
        //缩放菜单
        zoomMenu = menuBar()->addMenu(tr("编辑"));
        zoomMenu->addAction(copyAction);
        zoomMenu->addAction(cutAction);
        zoomMenu->addAction(pasteAction);
        zoomMenu->addAction(aboutAction);
        zoomMenu->addSeparator();
        zoomMenu->addAction(zoomInAction);
        zoomMenu->addAction(zoomOutAction);
    
    
        //旋转菜单
        rotateMenu = menuBar()->addMenu(tr("旋转"));
        rotateMenu->addAction(rotate90Action);
        rotateMenu->addAction(rotate180Action);
        rotateMenu->addAction(rotate270Action);
    
        //镜像菜单
        mirrorMenu = menuBar()->addMenu(tr("镜像"));
        mirrorMenu->addAction(mirrorVerticalAction);
        mirrorMenu->addAction(mirrorHorizontalAction);
    }
    
    
    void ImgProcessor::createToolBars()
    {
        //文件工具条
        fileTool = addToolBar("File");	//QMainWindow直接调用addToolBar()函数获得主窗口的工具条对象。
        fileTool->addAction(openFileAction);//向工具条查出属于该工具条的工作。
        fileTool->addAction(NewFileAction);
        fileTool->addAction(printTRextAction);
        fileTool->addAction(printImageAction);
    
        //编辑工具条
        zoomTool = addToolBar("Edit");
        zoomTool->addAction(copyAction);
        zoomTool->addAction(cutAction);
        zoomTool->addAction(pasteAction);
        zoomTool->addSeparator();
        zoomTool->addAction(zoomInAction);
        zoomTool->addAction(zoomOutAction);
    
        //旋转工具条
        rotateTool = addToolBar("rotate");
        rotateTool->addAction(rotate90Action);
        rotateTool->addAction(rotate180Action);
        rotateTool->addAction(rotate270Action);
    
        //撤销和重做工具条
        doToolBar = addToolBar("doEdit");
        doToolBar->addAction(undoAction);
        doToolBar->addAction(redoAction);
    }
    
    

    显示结果

    在这里插入图片描述

    Qt5 文件操作功能

    新建文件

    实现新建空白文件的功能,步骤如下:

    • 打开“imgprocessor.h”头文件,添加槽函数及实现如下:
    private slots:
        void showNewFile();//新建文件
    
    void ImgProcessor::createActions()
    {
        //“新建”动作
        NewFileAction = new QAction(QIcon("new.png"), tr("新建"), this);
        NewFileAction->setShortcut(tr("Ctrl+N"));
        NewFileAction->setStatusTip(tr("新建一个文件"));
        connect(NewFileAction, SIGNAL(triggered()), this, SLOT(showNewFile()));
    }
    
    void ImgProcessor::showNewFile()
    {
        ImgProcessor *newImgProcessor = new ImgProcessor;
        newImgProcessor->show();
    }
    
    

    打开文件

    打开功能是读取一个已经存在的文件,将文件内容显示在窗口中。
    在头文件和源文件中添加对应的槽函数及实现:

        void showOpenFile();//打开文件
    
    void ImgProcessor::createActions()
    {
        //“打开”动作
        openFileAction = new QAction(QIcon("open.png"), tr("打开"), this);
        openFileAction->setShortcut(tr("Ctrl+O"));
        openFileAction->setStatusTip(tr("打开一个文件"));
        connect(openFileAction, SIGNAL(triggered()), this, SLOT(showOpenFile()));void ImgProcessor::loadFile(QString filename)
    {
        qDebug() << "file name :" << filename;
        QFile file(filename);
        if(file.open(QIODevice::ReadOnly | QIODevice::Text))
        {
            QTextStream textStream(&file);
            while(!textStream.atEnd())
            {
                showWidget->text->append(textStream.readLine());
                qDebug() << "read line";
            }
        }
    }
    
    void ImgProcessor::showOpenFile()
    {
        fileName = QFileDialog::getOpenFileName(this);
        if(!fileName.isEmpty())
        {
            if(showWidget->text->document()->isEmpty())
            {
                loadFile(fileName);
            }
            else
            {
                ImgProcessor *newImgProcessor = new ImgProcessor;
                newImgProcessor->show();
                newImgProcessor->loadFile(fileName);
            }
        }
    }
    
    

    打印文件

    打印的文件分为文本和图片两种格式,下面分别介绍。

    • 文本打印
      使用Qt提供的标准打印对话框,QPrintDialog。具体如下:
        void showPrintText();//打印文本文件
    
        connect(printTRextAction, SIGNAL(triggered()), this, SLOT(showPrintText()));
    
    void ImgProcessor::showPrintText()
    {
        QPrinter printer;
        QPrintDialog printDialog(&printer, this);//创建一个QPrintDialog对象。
        if(printDialog.exec())
        {
            //获得QTextEdit 对象的文档
            QTextDocument *doc = showWidget->text->document();
            doc->print(&printer);
        }
    }
    
    
    • 图像打印
      添加槽函数。
        void showPrintImage();//打印图片
    
    
        connect(printImageAction, SIGNAL(triggered()), this, SLOT(showPrintImage()));
    
    void ImgProcessor::showPrintImage()
    {
        QPrinter printer;
        QPrintDialog printDialog(&printer, this);
        if(printDialog.exec())
        {
            QPainter painter(&printer);
            QRect rect = painter.viewport();//获得QPainter 对象的视图矩形区域
            QSize size = img.size();
            //安装图片的比例大小重新设定视图矩形区域
            size.scale(rect.size(), Qt::KeepAspectRatio);
            painter.setViewport(rect.x(), rect.y(), size.width(), size.height());
            painter.setWindow(img.rect());
            painter.drawImage(0, 0, img);
    
        }
    }
    

    Qt5 图像坐标变换

    QMatrix类提供了世界坐标系统的二维转换功能,可以使窗体转换变形,经常在绘图程序中使用,还可以实现坐标系统的移动、缩放、变形及旋转功能。

    setScaledContents 用来设置该控件的scaledContents属性,确定是否根据其大小自动调节内容大小,以便内容充满整个有效区域。若设置值为true,则当现实图片时,控件会根据其大小对图片进行调节。该属性默认值为false,另外,可以通过hasScaledContents() 来获取该属性的值。

    缩放功能

    下面将实现缩放功能。

    
        void showZoomIn();//放大
        void showZoomOut();//缩小
    
    void ImgProcessor::showZoomIn()
    {
        if(img.isNull())//有效判断
        {
            return;
        }
        QMatrix martix;//声明一个QMatrix类的实例
        martix.scale(2, 2); //该参数决定x方向和y方向的缩放比例
        img = img.transformed(martix);
        showWidget->imageLabel->setPixmap(QPixmap::fromImage(img));
    }
    
    void ImgProcessor::showZoomOut()
    {
        if(img.isNull())
        {
            return ;
        }
        QMatrix matrix;
        matrix.scale(0.5, 0.5);
        img = img.transformed(matrix);
        showWidget->imageLabel->setPixmap(QPixmap::fromImage(img));
    }
    
    

    旋转功能

        void showRotate90(); //旋转90
        void showRotate180();
        void showRotate270();
    
        //实现图像旋转的动作
        //90
        rotate90Action = new QAction(QIcon("rotate90.png"), tr("旋转90"), this);
        rotate90Action->setStatusTip(tr("将一幅图像旋转90度"));
        connect(rotate90Action, SIGNAL(triggered()), this, SLOT(showRotate90()));
        //180
        rotate180Action = new QAction(QIcon("rotate180.png"), tr("旋转180"), this);
        rotate180Action->setStatusTip(tr("将一幅图像旋转180度"));
        connect(rotate180Action, SIGNAL(triggered()), this, SLOT(showRotate180()));
        //270
        rotate270Action = new QAction(QIcon("rotate270.png"), tr("旋转270"), this);
        rotate270Action->setStatusTip(tr("将一副图像旋转270度"));
        connect(rotate270Action, SIGNAL(triggered()), this, SLOT(showRotate270()));
    
    
    
    void ImgProcessor::showRotate90()
    {
        if(img.isNull())
        {
            return ;
        }
        QMatrix matrix;
        matrix.rotate(90);
        img = img.transformed(matrix);
        showWidget->imageLabel->setPixmap(QPixmap::fromImage(img));
    }
    
    void ImgProcessor::showRotate180()
    {
        if(img.isNull())
        {
            return ;
        }
        QMatrix matrix;
        matrix.rotate(180);
        img = img.transformed(matrix);
        showWidget->imageLabel->setPixmap(QPixmap::fromImage(img));
    }
    
    void ImgProcessor::showRotate270()
    {
        if(img.isNull())
        {
            return ;
        }
        QMatrix matrix;
        matrix.rotate(270);
        img = img.transformed(matrix);
        showWidget->imageLabel->setPixmap(QPixmap::fromImage(img));
    }
    
    

    Qt5 文本编辑功能

    在编写包含格式设置的文本编辑程序时,经常用到的Qt类有QTextEdit、QTextDocument、QTextBlock、QTextList、QTextFrame、QTextTable、QTextCharFormat、QTextBlockFormat、QTextListFormat、QTextFrameFormat和QTextTableFormat等。

    任何一个文本编辑的程序都要用到QTextEdit作为输入文本的容器,在它里面输入可编辑文本由QTextDocument作为载体,而用来表示QTextDocument的元素的QTextBlock、QTextList、QTextFrame等都是QTextDocument的不同表现形式,可以表示为字符串、段落、列表、表格或图片等。

    每种元素都有自己的个数,这些格式则是用这些类来实现的。

    实现文本编辑的具体步骤:

    • 在“imgprocessor.h”头文件中添加“private”变量:
    
        QLabel *fontLabel;
        QFontComboBox *fontComboBox;
        QLabel *fontLabel2;
        QComboBox *sizeComboBox;
        QToolButton *boldBtn;
        QToolButton *italicBtn;
        QToolButton *underlineBtn;
        QToolButton *colorBtn;
        QToolBar *fontToolBar;
    
    • 在“imgprocessor.h”头文件中添加槽函数:
    
    protected slots:
        void ShowFontComboBox(QString comboStr);
        void ShowSizeSpinBox(QString spinValue);
        void ShowBoldBtn();
        void ShowItalicBtn();
        void ShowUnderlineBtn();
        void ShowColorBtn();
        void ShowCurrentFormatChanged(const QTextCharFormat &fmt);
    
    
    • 在相对应的构造函数中,添加以下语句:
    ImgProcessor::ImgProcessor(QWidget *parent)
        : QMainWindow(parent)
    {
        setWindowTitle(tr("Easy Word"));    //窗口标题
    
        showWidget = new ShowWidget(this);
        setCentralWidget(showWidget);
    
        //在工具栏上嵌入控件
        //设置字体
        fontLabel = new QLabel(tr("字体:"));
        fontComboBox = new QFontComboBox;
        fontComboBox->setFontFilters(QFontComboBox::ScalableFonts);
        fontLabel2 = new QLabel(tr("字号:"));
        sizeComboBox = new QComboBox;
        QFontDatabase db;
        foreach(int size, db.standardSizes())
            sizeComboBox->addItem(QString::number(size));
        boldBtn = new QToolButton;
        boldBtn->setIcon(QIcon("bold.png"));
        boldBtn->setCheckable(true);
        italicBtn = new QToolButton;
        italicBtn->setIcon(QIcon("italic.png"));
        italicBtn->setCheckable(true);
        underlineBtn = new QToolButton;
        underlineBtn->setIcon(QIcon("under.png"));
        underlineBtn->setCheckable(true);
        colorBtn = new QToolButton;
        colorBtn->setIcon(QIcon("color.png"));
        colorBtn->setCheckable(true);
    
        //创建动作、菜单、工具栏
        createActions();
        createMenus();
        createToolBars();
    
        if(img.load("mage.png"))
        {
            //在imagelabel中放置图像
            showWidget->imageLabel->setPixmap(QPixmap::fromImage(img));
        }
    
        connect(fontComboBox, SIGNAL(activated(QString)), this, SLOT(ShowFontComboBox(QString)));
        connect(sizeComboBox, SIGNAL(activated(QString)), this, SLOT(ShowSizeSpinBox(QString)));
        connect(boldBtn, SIGNAL(clicked()), this, SLOT(ShowBoldBtn()));
        connect(italicBtn, SIGNAL(clicked()), this, SLOT(ShowItalicBtn()));
        connect(underlineBtn, SIGNAL(clicked()), this, SLOT(ShowUnderlineBtn()));
        connect(colorBtn, SIGNAL(clicked()), this, SLOT(ShowColorBtn()));
        connect(showWidget->text, SIGNAL(currentCharFormatChanged(QTextCharFormat &)), this, SLOT(ShowCurrentFormatChanged(const QTextCharFormat &)));
    
    }
    
    
    
    void ImgProcessor::ShowFontComboBox(QString comboStr)
    {
        //设置字体
        QTextCharFormat fmt;//创建一个QTextCharFormat对象
        fmt.setFontFamily(comboStr);//选择的字体名称设置给QTextCharFormat对象
        mergeFormat(fmt);//将新的格式应用到光标选区内的字符。
    }
    
    void ImgProcessor::mergeFormat(QTextCharFormat format)
    {
        //设置格式
        QTextCursor cursor = showWidget->text->textCursor();//获得编辑框中的光标
    
        if(!cursor.hasSelection())
        {
            cursor.select(QTextCursor::WordUnderCursor);
        }
        cursor.mergeCharFormat(format);
        showWidget->text->mergeCurrentCharFormat(format);
    }
    
    void ImgProcessor::ShowSizeSpinBox(QString spinValue)
    {
        //设置字号
        qDebug() << spinValue << "--" << spinValue.toFloat();
        QTextCharFormat fmt;
        fmt.setFontPointSize(spinValue.toFloat());
        showWidget->text->mergeCurrentCharFormat(fmt);
    }
    
    void ImgProcessor::ShowBoldBtn()
    {
        //设置选中的字体加粗
        QTextCharFormat fmt;
        fmt.setFontWeight(boldBtn->isChecked() ? QFont::Bold : QFont::Normal);
        showWidget->text->mergeCurrentCharFormat(fmt);
    }
    
    void ImgProcessor::ShowItalicBtn()
    {
        //设置字体斜体
        QTextCharFormat fmt;
        fmt.setFontItalic(italicBtn->isChecked());
        showWidget->text->mergeCurrentCharFormat(fmt);
    }
    
    void ImgProcessor::ShowUnderlineBtn()
    {
        //设置文字下划线
        QTextCharFormat fmt;
        fmt.setFontUnderline(underlineBtn->isChecked());
        showWidget->text->mergeCurrentCharFormat(fmt);
    }
    
    void ImgProcessor::ShowColorBtn()
    {
        //设置颜色
        QColor color = QColorDialog::getColor(Qt::red, this);
        if(color.isValid())
        {
            QTextCharFormat fmt;
            fmt.setForeground(color);
            showWidget->text->mergeCurrentCharFormat(fmt);
        }
    }
    
    void ImgProcessor::ShowCurrentFormatChanged(const QTextCharFormat &fmt)
    {
        fontComboBox->setCurrentIndex(fontComboBox->findText(fmt.fontFamily()));
        sizeComboBox->setCurrentIndex(sizeComboBox->findText(QString::number(fmt.fontPointSize())));
        boldBtn->setChecked(fmt.font().bold());
        italicBtn->setChecked(fmt.fontItalic());
        underlineBtn->setChecked(fmt.fontUnderline());
    }
    
    

    Qt5 排版功能

        //排版
        void showList(int);
        void showAlignment(QAction *act);
        void showCursorPositionChanged();
    
        //排版功能
        QLabel *listLabel;
        QComboBox *listComboBox;
        QActionGroup *actGrp;
        QAction *leftAction;
        QAction *rightAction;
        QAction *centerAction;
        QAction *justifyAction;
        QToolBar *listToolBar;
    
    
    
    
       //排版格式
        listLabel = new QLabel(tr("排序"));
        listComboBox = new QComboBox;
        listComboBox->addItem("Standard");
        listComboBox->addItem("QTextListFormat::ListDisc");
        listComboBox->addItem("QTextListFormat::ListCircle");
        listComboBox->addItem("QTextListFormat::ListSquare");
        listComboBox->addItem("QTextListFormat::ListDecimal");
        listComboBox->addItem("QTextListFormat::ListLowerAlpha");
        listComboBox->addItem("QTextListFormat::ListUpperAlpha");
        listComboBox->addItem("QTextListFormat::ListLowerRoman");
        listComboBox->addItem("QTextListFormat::ListUpperRoman");
        //排版格式
        connect(listComboBox, SIGNAL(activated(int)), this, SLOT(showList(int)));
        connect(showWidget->text->document(), SIGNAL(undoAvailable(bool)), redoAction, SLOT(setEnabled(bool)));
        connect(showWidget->text->document(), SIGNAL(redoAvailable(bool)), redoAction, SLOT(setEnabled(bool)));
        connect(showWidget->text->document(), SIGNAL(cursorPositionChanged()), this, SLOT(showCursorPositionChanged()));
    
    void ImgProcessor::ShowCurrentFormatChanged(const QTextCharFormat &fmt)
    {
        fontComboBox->setCurrentIndex(fontComboBox->findText(fmt.fontFamily()));
        sizeComboBox->setCurrentIndex(sizeComboBox->findText(QString::number(fmt.fontPointSize())));
        boldBtn->setChecked(fmt.font().bold());
        italicBtn->setChecked(fmt.fontItalic());
        underlineBtn->setChecked(fmt.fontUnderline());
    }
    
    void ImgProcessor::showAlignment(QAction *act)
    {
        if(act == leftAction)
        {
            //左对齐
            showWidget->text->setAlignment(Qt::AlignLeft);
        }
        if(act == rightAction)
        {
            //右对齐
            showWidget->text->setAlignment(Qt::AlignRight);
        }
        if(act == centerAction)
        {
            //居中
            showWidget->text->setAlignment(Qt::AlignCenter);
        }
        if(act == justifyAction)
        {
            //两端对齐
            showWidget->text->setAlignment(Qt::AlignJustify);
        }
    }
    
    void ImgProcessor::showCursorPositionChanged()
    {
        if(showWidget->text->alignment() == Qt::AlignLeft)
            leftAction->setChecked(true);
        if(showWidget->text->alignment() == Qt::AlignRight)
            rightAction->setChecked(true);
        if(showWidget->text->alignment() == Qt::AlignCenter)
            centerAction->setChecked(true);
        if(showWidget->text->alignment() == Qt::AlignJustify)
            justifyAction->setChecked(true);
    }
    
    void ImgProcessor::showList(int index)
    {
        //获得编辑框的QTextCursor对象指针
        QTextCursor cursor = showWidget->text->textCursor();
        if(index != 0)
        {
            QTextListFormat::Style style = QTextListFormat::ListDisc;//从下拉列表中旋转确定QTextlistformat的style属性值。
            switch (index) {
            default:
            case 1:
                style = QTextListFormat::ListDisc;
                break;
            case 2:
                style = QTextListFormat::ListCircle;
                break;
            case 3:
                style = QTextListFormat::ListSquare;
                break;
            case 4:
                style = QTextListFormat::ListDecimal;
                break;
            case 5:
                style = QTextListFormat::ListLowerAlpha;
                break;
            case 6:
                style = QTextListFormat::ListUpperAlpha;
                break;
            case 7:
                style = QTextListFormat::ListLowerRoman;
                break;
            case 8:
                style = QTextListFormat::ListUpperRoman;
            }
            //设置缩进值
            cursor.beginEditBlock();
            QTextBlockFormat blockFmt = cursor.blockFormat();//获得段落缩进值
            QTextListFormat listFmt;
            if(cursor.currentList())
            {
                listFmt = cursor.currentList()->format();
            }
            else{
                listFmt.setIndent(blockFmt.indent() + 1);
                blockFmt.setIndent(0);
                cursor.setBlockFormat(blockFmt);
            }
            listFmt.setStyle(style);
            cursor.createList(listFmt);
            cursor.endEditBlock();
        }
        else{
            QTextBlockFormat bfmt;
            bfmt.setObjectIndex(-1);
            cursor.mergeBlockFormat(bfmt);
        }
    }
    
    
    • main.cpp
    #include "imgprocessor.h"
    
    #include <QApplication>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        QFont f("ZYSong18030", 12);
        a.setFont(f);
        ImgProcessor w;
        w.show();
        return a.exec();
    }
    
    

    最终实现效果及全部代码

    全部代码

    • main.cpp
    #include "imgprocessor.h"
    
    #include <QApplication>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        QFont f("ZYSong18030", 12);
        a.setFont(f);
        ImgProcessor w;
        w.show();
        return a.exec();
    }
    
    
    • imgprocessor.h
    #ifndef IMGPROCESSOR_H
    #define IMGPROCESSOR_H
    
    #include <QMainWindow>
    #include <QImage>
    #include <QLabel>
    #include <QMenu>
    #include <QMenuBar>
    #include <QAction>
    #include <QComboBox>
    #include <QSpinBox>
    #include <QToolBar>
    #include <QFontComboBox>
    #include <QToolButton>
    #include <QTextCharFormat>
    #include "showwidget.h"
    #include <QDebug>
    
    class ImgProcessor : public QMainWindow
    {
        Q_OBJECT
    
    public:
        ImgProcessor(QWidget *parent = nullptr);
        ~ImgProcessor();
    
        void createActions();
        void createMenus();
        void createToolBars();
        void loadFile(QString filename);
        void mergeFormat(QTextCharFormat);
    
    private slots:
        void showNewFile();//新建文件
        void showOpenFile();//打开文件
        void showPrintText();//打印文本文件
        void showPrintImage();//打印图片
        void showZoomIn();//放大
        void showZoomOut();//缩小
        void showRotate90(); //旋转90
        void showRotate180();
        void showRotate270();
    
    protected slots:
        //字体格式
        void ShowFontComboBox(QString comboStr);
        void ShowSizeSpinBox(QString spinValue);
        void ShowBoldBtn();
        void ShowItalicBtn();
        void ShowUnderlineBtn();
        void ShowColorBtn();
        void ShowCurrentFormatChanged(const QTextCharFormat &fmt);
    
        //排版
        void showList(int);
        void showAlignment(QAction *act);
        void showCursorPositionChanged();
    
    private:
        QMenu *fileMenu;
        QMenu *zoomMenu;
        QMenu *rotateMenu;
        QMenu *mirrorMenu;
        QImage img;
        QString fileName;
    
        ShowWidget *showWidget; //文件菜单项
        QAction *openFileAction;
        QAction *NewFileAction;
        QAction *printTRextAction;
        QAction *printImageAction;
        QAction *exitAction;
        QAction *copyAction;    //编辑菜单项
        QAction *cutAction;
        QAction *pasteAction;
        QAction *aboutAction;
        QAction *zoomInAction;
        QAction *zoomOutAction;
        QAction *rotate90Action;    //旋转菜单项
        QAction *rotate180Action;
        QAction *rotate270Action;
        QAction *mirrorVerticalAction;  //镜像菜单项
        QAction *mirrorHorizontalAction;
        QAction *undoAction;
        QAction *redoAction;
        QToolBar *fileTool; //工具栏
        QToolBar *zoomTool;
        QToolBar *rotateTool;
        QToolBar *mirrorTool;
        QToolBar *doToolBar;
    
        //字体格式功能
        QLabel *fontLabel;
        QFontComboBox *fontComboBox;
        QLabel *fontLabel2;
        QComboBox *sizeComboBox;
        QToolButton *boldBtn;
        QToolButton *italicBtn;
        QToolButton *underlineBtn;
        QToolButton *colorBtn;
        QToolBar *fontToolBar;
    
        //排版功能
        QLabel *listLabel;
        QComboBox *listComboBox;
        QActionGroup *actGrp;
        QAction *leftAction;
        QAction *rightAction;
        QAction *centerAction;
        QAction *justifyAction;
        QToolBar *listToolBar;
    };
    #endif // IMGPROCESSOR_H
    
    
    • imgprocessor.cpp
    #include "imgprocessor.h"
    #include <QFileDialog>
    #include <QFile>
    #include <QTextStream>
    #include <QtPrintSupport/QPrintDialog>
    #include <QtPrintSupport/QPrinter>
    #include <QPainter>
    #include <QColor>
    #include <QColorDialog>
    #include <QTextCursor>
    #include <QTextList>
    #include <QTextListFormat>
    
    ImgProcessor::ImgProcessor(QWidget *parent)
        : QMainWindow(parent)
    {
        setWindowTitle(tr("Easy Word"));    //窗口标题
    
        showWidget = new ShowWidget(this);
        setCentralWidget(showWidget);
    
        //在工具栏上嵌入控件
        //设置字体
        fontLabel = new QLabel(tr("字体:"));
        fontComboBox = new QFontComboBox;
        fontComboBox->setFontFilters(QFontComboBox::ScalableFonts);
        fontLabel2 = new QLabel(tr("字号:"));
        sizeComboBox = new QComboBox;
        QFontDatabase db;
        foreach(int size, db.standardSizes())
            sizeComboBox->addItem(QString::number(size));
        boldBtn = new QToolButton;
        boldBtn->setIcon(QIcon("bold.png"));
        boldBtn->setCheckable(true);
        italicBtn = new QToolButton;
        italicBtn->setIcon(QIcon("italic.png"));
        italicBtn->setCheckable(true);
        underlineBtn = new QToolButton;
        underlineBtn->setIcon(QIcon("under.png"));
        underlineBtn->setCheckable(true);
        colorBtn = new QToolButton;
        colorBtn->setIcon(QIcon("color.png"));
        colorBtn->setCheckable(true);
    
        //排版格式
        listLabel = new QLabel(tr("排序"));
        listComboBox = new QComboBox;
        listComboBox->addItem("Standard");
        listComboBox->addItem("QTextListFormat::ListDisc");
        listComboBox->addItem("QTextListFormat::ListCircle");
        listComboBox->addItem("QTextListFormat::ListSquare");
        listComboBox->addItem("QTextListFormat::ListDecimal");
        listComboBox->addItem("QTextListFormat::ListLowerAlpha");
        listComboBox->addItem("QTextListFormat::ListUpperAlpha");
        listComboBox->addItem("QTextListFormat::ListLowerRoman");
        listComboBox->addItem("QTextListFormat::ListUpperRoman");
    
        //创建动作、菜单、工具栏
        createActions();
        createMenus();
        createToolBars();
    
        if(img.load("mage.png"))
        {
            //在imagelabel中放置图像
            showWidget->imageLabel->setPixmap(QPixmap::fromImage(img));
        }
    
        //字体设置
        connect(fontComboBox, SIGNAL(activated(QString)), this, SLOT(ShowFontComboBox(QString)));
        connect(sizeComboBox, SIGNAL(activated(QString)), this, SLOT(ShowSizeSpinBox(QString)));
        connect(boldBtn, SIGNAL(clicked()), this, SLOT(ShowBoldBtn()));
        connect(italicBtn, SIGNAL(clicked()), this, SLOT(ShowItalicBtn()));
        connect(underlineBtn, SIGNAL(clicked()), this, SLOT(ShowUnderlineBtn()));
        connect(colorBtn, SIGNAL(clicked()), this, SLOT(ShowColorBtn()));
        connect(showWidget->text, SIGNAL(currentCharFormatChanged(QTextCharFormat &)), this, SLOT(ShowCurrentFormatChanged(const QTextCharFormat &)));
    
        //排版格式
        connect(listComboBox, SIGNAL(activated(int)), this, SLOT(showList(int)));
        connect(showWidget->text->document(), SIGNAL(undoAvailable(bool)), redoAction, SLOT(setEnabled(bool)));
        connect(showWidget->text->document(), SIGNAL(redoAvailable(bool)), redoAction, SLOT(setEnabled(bool)));
        connect(showWidget->text->document(), SIGNAL(cursorPositionChanged()), this, SLOT(showCursorPositionChanged()));
    }
    
    ImgProcessor::~ImgProcessor()
    {
    }
    
    void ImgProcessor::createActions()
    {
        //“打开”动作
        openFileAction = new QAction(QIcon("open.png"), tr("打开"), this);
        openFileAction->setShortcut(tr("Ctrl+O"));
        openFileAction->setStatusTip(tr("打开一个文件"));
        connect(openFileAction, SIGNAL(triggered()), this, SLOT(showOpenFile()));
    
        //“新建”动作
        NewFileAction = new QAction(QIcon("new.png"), tr("新建"), this);
        NewFileAction->setShortcut(tr("Ctrl+N"));
        NewFileAction->setStatusTip(tr("新建一个文件"));
        connect(NewFileAction, SIGNAL(triggered()), this, SLOT(showNewFile()));
    
        //“退出”动作
        exitAction = new QAction(tr("退出"), this);
        exitAction->setShortcut(tr("Ctrl+Q"));
        exitAction->setStatusTip(tr("退出程序"));
        connect(exitAction, SIGNAL(triggered()), this, SLOT(close()));
    
        //“复制”动作
        copyAction = new QAction(QIcon("copy.png"), tr("复制"), this);
        copyAction->setShortcut(tr("Ctrl+C"));
        copyAction->setStatusTip(tr("复制文件"));
        connect(copyAction, SIGNAL(triggered()), showWidget->text, SLOT(copy()));
    
        //“剪切”动作
        cutAction = new QAction(QIcon("cut.png"), tr("剪切"), this);
        cutAction->setShortcut(tr("Ctrl+X"));
        cutAction->setStatusTip(tr("剪切文件"));
        connect(cutAction, SIGNAL(truggered()), showWidget->text, SLOT(cut()));
    
        //“粘贴”动作
        pasteAction = new QAction(QIcon("paste.png"), tr("粘贴"), this);
        pasteAction->setShortcut(tr("Ctrl+V"));
        pasteAction->setStatusTip(tr("粘贴文件"));
        connect(pasteAction, SIGNAL(triggered()), showWidget->text, SLOT(paste()));
    
        //“关于”动作
        aboutAction = new QAction(tr("关于"), this);
        connect(aboutAction, SIGNAL(triggered()), this, SLOT(QApplication::aboutQt()));
    
        //“打印文本”动作
        printTRextAction = new QAction(QIcon("printText.png"), tr("打印文本"), this);
        printTRextAction->setStatusTip(tr("打印一个文本"));
        connect(printTRextAction, SIGNAL(triggered()), this, SLOT(showPrintText()));
    
    
        //“打印图像”动作
        printImageAction = new QAction(QIcon("printImage.png"), tr("打印图像"), this);
        printImageAction->setStatusTip(tr("打印一幅图像"));
        connect(printImageAction, SIGNAL(triggered()), this, SLOT(showPrintImage()));
    
        //“放大”动作
        zoomInAction = new QAction(QIcon("zoomin.png"), tr("放大"), this);
        zoomInAction->setStatusTip(tr("放大一张照片"));
        connect(zoomInAction, SIGNAL(triggered()), this, SLOT(showZoomIn()));
    
        //“缩小”动作
        zoomOutAction = new QAction(QIcon("zoomout.png"), tr("缩小"), this);
        zoomOutAction->setStatusTip(tr("缩小一张照片"));
        connect(zoomOutAction, SIGNAL(triggered()), this, SLOT(showZoomOut()));
    
        //实现图像旋转的动作
        //90
        rotate90Action = new QAction(QIcon("rotate90.png"), tr("旋转90"), this);
        rotate90Action->setStatusTip(tr("将一幅图像旋转90度"));
        connect(rotate90Action, SIGNAL(triggered()), this, SLOT(showRotate90()));
        //180
        rotate180Action = new QAction(QIcon("rotate180.png"), tr("旋转180"), this);
        rotate180Action->setStatusTip(tr("将一幅图像旋转180度"));
        connect(rotate180Action, SIGNAL(triggered()), this, SLOT(showRotate180()));
        //270
        rotate270Action = new QAction(QIcon("rotate270.png"), tr("旋转270"), this);
        rotate270Action->setStatusTip(tr("将一副图像旋转270度"));
        connect(rotate270Action, SIGNAL(triggered()), this, SLOT(showRotate270()));
    
        //实现图像镜像的动作
        //纵向
        mirrorVerticalAction = new QAction(QIcon("mirrorV.png"), tr("纵向镜像"), this);
        mirrorVerticalAction->setStatusTip(tr("对一幅图像纵向镜像"));
    
        //横向
        mirrorHorizontalAction = new QAction(QIcon("mirrorH.png"), tr("横向镜像"), this);
        mirrorHorizontalAction->setStatusTip(tr("对一副图像横向镜像"));
    
        //实现撤销和恢复动作
        undoAction = new QAction(QIcon("undo.png"), tr("撤销"), this);
        connect(undoAction, SIGNAL(triggered()), showWidget->text, SLOT(undo()));
    
        redoAction = new QAction(QIcon("redo.png"), tr("重做"), this);
        connect(redoAction, SIGNAL(triggered()), showWidget->text, SLOT(redo()));
    
        //排序:左对齐、右对齐、居中和两端对齐
        actGrp = new QActionGroup(this);
        leftAction = new QAction(QIcon("left.png"), "左对齐", actGrp);
        leftAction->setCheckable(true);
        rightAction = new QAction(QIcon("right.png"), "右对齐", actGrp);
        rightAction->setCheckable(true);
        centerAction = new QAction(QIcon("center.png"), "居中", actGrp);
        centerAction->setCheckable(true);
        justifyAction = new QAction(QIcon("justify.png"), "两端对齐", actGrp);
        justifyAction->setCheckable(true);
        connect(actGrp, SIGNAL(triggered(QAction *)), this, SLOT(showAlignment(QAction *)));
    
    }
    
    void ImgProcessor::createMenus()
    {
        //文件菜单
        fileMenu = menuBar()->addMenu(tr("文件"));
        fileMenu->addAction(openFileAction);
        fileMenu->addAction(NewFileAction);
        fileMenu->addAction(printTRextAction);
        fileMenu->addAction(printImageAction);
        fileMenu->addSeparator();//插入空格
        fileMenu->addAction(exitAction);
    
        //缩放菜单
        zoomMenu = menuBar()->addMenu(tr("编辑"));
        zoomMenu->addAction(copyAction);
        zoomMenu->addAction(cutAction);
        zoomMenu->addAction(pasteAction);
        zoomMenu->addAction(aboutAction);
        zoomMenu->addSeparator();
        zoomMenu->addAction(zoomInAction);
        zoomMenu->addAction(zoomOutAction);
    
    
        //旋转菜单
        rotateMenu = menuBar()->addMenu(tr("旋转"));
        rotateMenu->addAction(rotate90Action);
        rotateMenu->addAction(rotate180Action);
        rotateMenu->addAction(rotate270Action);
    
        //镜像菜单
        mirrorMenu = menuBar()->addMenu(tr("镜像"));
        mirrorMenu->addAction(mirrorVerticalAction);
        mirrorMenu->addAction(mirrorHorizontalAction);
    }
    
    
    void ImgProcessor::createToolBars()
    {
        //文件工具条
        fileTool = addToolBar("File");
        fileTool->addAction(openFileAction);
        fileTool->addAction(NewFileAction);
        fileTool->addAction(printTRextAction);
        fileTool->addAction(printImageAction);
    
        //编辑工具条
        zoomTool = addToolBar("Edit");
        zoomTool->addAction(copyAction);
        zoomTool->addAction(cutAction);
        zoomTool->addAction(pasteAction);
        zoomTool->addSeparator();
        zoomTool->addAction(zoomInAction);
        zoomTool->addAction(zoomOutAction);
    
        //旋转工具条
        rotateTool = addToolBar("rotate");
        rotateTool->addAction(rotate90Action);
        rotateTool->addAction(rotate180Action);
        rotateTool->addAction(rotate270Action);
    
        //撤销和重做工具条
        doToolBar = addToolBar("doEdit");
        doToolBar->addAction(undoAction);
        doToolBar->addAction(redoAction);
    
        //字体工具条
        fontToolBar = addToolBar("font");
        fontToolBar->addWidget(fontLabel);
        fontToolBar->addWidget(fontLabel2);
        fontToolBar->addWidget(sizeComboBox);
        fontToolBar->addSeparator();
        fontToolBar->addWidget(boldBtn);
        fontToolBar->addWidget(italicBtn);
        fontToolBar->addWidget(underlineBtn);
        fontToolBar->addSeparator();
        fontToolBar->addWidget(colorBtn);
    
        //排版工具条
        listToolBar = addToolBar("list");
        listToolBar->addWidget(listLabel);
        listToolBar->addWidget(listComboBox);
        listToolBar->addSeparator();
        listToolBar->addActions(actGrp->actions());
    }
    
    void ImgProcessor::showNewFile()
    {
        ImgProcessor *newImgProcessor = new ImgProcessor;
        newImgProcessor->show();
    }
    
    void ImgProcessor::loadFile(QString filename)
    {
        qDebug() << "file name :" << filename;
        QFile file(filename);
        if(file.open(QIODevice::ReadOnly | QIODevice::Text))
        {
            QTextStream textStream(&file);
            while(!textStream.atEnd())
            {
                showWidget->text->append(textStream.readLine());
                qDebug() << "read line";
            }
        }
    }
    
    void ImgProcessor::showOpenFile()
    {
        fileName = QFileDialog::getOpenFileName(this);
        if(!fileName.isEmpty())
        {
            if(showWidget->text->document()->isEmpty())
            {
                loadFile(fileName);
            }
            else
            {
                ImgProcessor *newImgProcessor = new ImgProcessor;
                newImgProcessor->show();
                newImgProcessor->loadFile(fileName);
            }
        }
    }
    
    void ImgProcessor::showPrintText()
    {
        QPrinter printer;
        QPrintDialog printDialog(&printer, this);//创建一个QPrintDialog对象。
        if(printDialog.exec())
        {
            //获得QTextEdit 对象的文档
            QTextDocument *doc = showWidget->text->document();
            doc->print(&printer);
        }
    }
    
    void ImgProcessor::showPrintImage()
    {
        QPrinter printer;
        QPrintDialog printDialog(&printer, this);
        if(printDialog.exec())
        {
            QPainter painter(&printer);
            QRect rect = painter.viewport();//获得QPainter 对象的视图矩形区域
            QSize size = img.size();
            //安装图片的比例大小重新设定视图矩形区域
            size.scale(rect.size(), Qt::KeepAspectRatio);
            painter.setViewport(rect.x(), rect.y(), size.width(), size.height());
            painter.setWindow(img.rect());
            painter.drawImage(0, 0, img);
    
        }
    }
    
    void ImgProcessor::showZoomIn()
    {
        if(img.isNull())//有效判断
        {
            return;
        }
        QMatrix martix;//声明一个QMatrix类的实例
        martix.scale(2, 2); //该参数决定x方向和y方向的缩放比例
        img = img.transformed(martix);
        showWidget->imageLabel->setPixmap(QPixmap::fromImage(img));
    }
    
    void ImgProcessor::showZoomOut()
    {
        if(img.isNull())
        {
            return ;
        }
        QMatrix matrix;
        matrix.scale(0.5, 0.5);
        img = img.transformed(matrix);
        showWidget->imageLabel->setPixmap(QPixmap::fromImage(img));
    }
    
    void ImgProcessor::showRotate90()
    {
        if(img.isNull())
        {
            return ;
        }
        QMatrix matrix;
        matrix.rotate(90);
        img = img.transformed(matrix);
        showWidget->imageLabel->setPixmap(QPixmap::fromImage(img));
    }
    
    void ImgProcessor::showRotate180()
    {
        if(img.isNull())
        {
            return ;
        }
        QMatrix matrix;
        matrix.rotate(180);
        img = img.transformed(matrix);
        showWidget->imageLabel->setPixmap(QPixmap::fromImage(img));
    }
    
    void ImgProcessor::showRotate270()
    {
        if(img.isNull())
        {
            return ;
        }
        QMatrix matrix;
        matrix.rotate(270);
        img = img.transformed(matrix);
        showWidget->imageLabel->setPixmap(QPixmap::fromImage(img));
    }
    
    void ImgProcessor::ShowFontComboBox(QString comboStr)
    {
        //设置字体
        QTextCharFormat fmt;//创建一个QTextCharFormat对象
        fmt.setFontFamily(comboStr);//选择的字体名称设置给QTextCharFormat对象
        mergeFormat(fmt);//将新的格式应用到光标选区内的字符。
    }
    
    void ImgProcessor::mergeFormat(QTextCharFormat format)
    {
        //设置格式
        QTextCursor cursor = showWidget->text->textCursor();//获得编辑框中的光标
    
        if(!cursor.hasSelection())
        {
            cursor.select(QTextCursor::WordUnderCursor);
        }
        cursor.mergeCharFormat(format);
        showWidget->text->mergeCurrentCharFormat(format);
    }
    
    void ImgProcessor::ShowSizeSpinBox(QString spinValue)
    {
        //设置字号
        qDebug() << spinValue << "--" << spinValue.toFloat();
        QTextCharFormat fmt;
        fmt.setFontPointSize(spinValue.toFloat());
        showWidget->text->mergeCurrentCharFormat(fmt);
    }
    
    void ImgProcessor::ShowBoldBtn()
    {
        //设置选中的字体加粗
        QTextCharFormat fmt;
        fmt.setFontWeight(boldBtn->isChecked() ? QFont::Bold : QFont::Normal);
        showWidget->text->mergeCurrentCharFormat(fmt);
    }
    
    void ImgProcessor::ShowItalicBtn()
    {
        //设置字体斜体
        QTextCharFormat fmt;
        fmt.setFontItalic(italicBtn->isChecked());
        showWidget->text->mergeCurrentCharFormat(fmt);
    }
    
    void ImgProcessor::ShowUnderlineBtn()
    {
        //设置文字下划线
        QTextCharFormat fmt;
        fmt.setFontUnderline(underlineBtn->isChecked());
        showWidget->text->mergeCurrentCharFormat(fmt);
    }
    
    void ImgProcessor::ShowColorBtn()
    {
        //设置颜色
        QColor color = QColorDialog::getColor(Qt::red, this);
        if(color.isValid())
        {
            QTextCharFormat fmt;
            fmt.setForeground(color);
            showWidget->text->mergeCurrentCharFormat(fmt);
        }
    }
    
    void ImgProcessor::ShowCurrentFormatChanged(const QTextCharFormat &fmt)
    {
        fontComboBox->setCurrentIndex(fontComboBox->findText(fmt.fontFamily()));
        sizeComboBox->setCurrentIndex(sizeComboBox->findText(QString::number(fmt.fontPointSize())));
        boldBtn->setChecked(fmt.font().bold());
        italicBtn->setChecked(fmt.fontItalic());
        underlineBtn->setChecked(fmt.fontUnderline());
    }
    
    void ImgProcessor::showAlignment(QAction *act)
    {
        if(act == leftAction)
        {
            //左对齐
            showWidget->text->setAlignment(Qt::AlignLeft);
        }
        if(act == rightAction)
        {
            //右对齐
            showWidget->text->setAlignment(Qt::AlignRight);
        }
        if(act == centerAction)
        {
            //居中
            showWidget->text->setAlignment(Qt::AlignCenter);
        }
        if(act == justifyAction)
        {
            //两端对齐
            showWidget->text->setAlignment(Qt::AlignJustify);
        }
    }
    
    void ImgProcessor::showCursorPositionChanged()
    {
        if(showWidget->text->alignment() == Qt::AlignLeft)
            leftAction->setChecked(true);
        if(showWidget->text->alignment() == Qt::AlignRight)
            rightAction->setChecked(true);
        if(showWidget->text->alignment() == Qt::AlignCenter)
            centerAction->setChecked(true);
        if(showWidget->text->alignment() == Qt::AlignJustify)
            justifyAction->setChecked(true);
    }
    
    void ImgProcessor::showList(int index)
    {
        //获得编辑框的QTextCursor对象指针
        QTextCursor cursor = showWidget->text->textCursor();
        if(index != 0)
        {
            QTextListFormat::Style style = QTextListFormat::ListDisc;//从下拉列表中旋转确定QTextlistformat的style属性值。
            switch (index) {
            default:
            case 1:
                style = QTextListFormat::ListDisc;
                break;
            case 2:
                style = QTextListFormat::ListCircle;
                break;
            case 3:
                style = QTextListFormat::ListSquare;
                break;
            case 4:
                style = QTextListFormat::ListDecimal;
                break;
            case 5:
                style = QTextListFormat::ListLowerAlpha;
                break;
            case 6:
                style = QTextListFormat::ListUpperAlpha;
                break;
            case 7:
                style = QTextListFormat::ListLowerRoman;
                break;
            case 8:
                style = QTextListFormat::ListUpperRoman;
            }
            //设置缩进值
            cursor.beginEditBlock();
            QTextBlockFormat blockFmt = cursor.blockFormat();//获得段落缩进值
            QTextListFormat listFmt;
            if(cursor.currentList())
            {
                listFmt = cursor.currentList()->format();
            }
            else{
                listFmt.setIndent(blockFmt.indent() + 1);
                blockFmt.setIndent(0);
                cursor.setBlockFormat(blockFmt);
            }
            listFmt.setStyle(style);
            cursor.createList(listFmt);
            cursor.endEditBlock();
        }
        else{
            QTextBlockFormat bfmt;
            bfmt.setObjectIndex(-1);
            cursor.mergeBlockFormat(bfmt);
        }
    }
    
    
    • showwidget.h
    #ifndef SHOWWIDGET_H
    #define SHOWWIDGET_H
    
    #include <QWidget>
    #include <QLabel>
    #include <QTextEdit>
    #include <QImage>
    
    class ShowWidget : public QWidget
    {
        Q_OBJECT
    public:
        explicit ShowWidget(QWidget *parent = nullptr);
    
        QImage img;
        QLabel *imageLabel;
        QTextEdit *text;
    
    signals:
    public slots:
    
    };
    
    #endif // SHOWWIDGET_H
    
    
    • showwidget.cpp
    #include "showwidget.h"
    #include<QHBoxLayout>
    
    ShowWidget::ShowWidget(QWidget *parent) : QWidget(parent)
    {
        imageLabel = new QLabel;
        imageLabel->setScaledContents(true);
        text = new QTextEdit;
        QHBoxLayout *mainLayout = new QHBoxLayout(this);
        mainLayout->addWidget(imageLabel);
        mainLayout->addWidget(text);
    }
    
    
    

    界面效果

    在这里插入图片描述

    展开全文
  • 如何在Word2010查找指定文字

    千次阅读 2017-11-13 09:31:08
    编辑Word文档过程,由于某种特殊需求,我们可能需要更改文档一些相同的字符,这个时候...2.文档左侧会出现一个“导航”窗口“导航”窗口的文本框输入需要查找的文字。 3.输入文字后,文本框下
    在编辑Word文档过程中,由于某种特殊需求,我们可能需要更改文档中一些相同的字符,这个时候我们就可以利用查找功能先将文档中指定的所有文字搜索出来。

    方法一、利用“查找”

    1.打开Word文档,选择“开始”选项卡,在“编辑”选项组中单击“查找”按钮。

    单击“查找”按钮

    2.在文档左侧会出现一个“导航”窗口,在“导航”窗口的文本框中输入需要查找的文字。

    输入需要查找的文字

    3.输入文字后,在文本框下面会出现所搜索文字在文档中有多少个匹配项,搜索的指定文字也会在正文部分全部以黄色底纹标识出来。

    查找的文字被标识出来了

    提示:此方法应用于在整个文档中查找指定文字,如果需要查找指定文本区域的文字可以使用下面的方法。

    方法二、利用“高级查找”

    1.打开Word文档,选择需要查找指定文字的文本区域。如果想在整个文档中查找,则可以不选中文本区域。选择“开始”选项卡,在“编辑”选项组中单击“查找”的下拉按钮,在弹出的下拉列表中选择“高级查找”命令。

    选择“高级查找”命令

    2.在弹出的“查找和替换”对话框中,选择“查找”选项卡,在“查找内容”的文本框中输入需要查找的文字,在“在以下项中查找”的下拉框中选择“当前所选内容”选择。如果想在整个文档中查找指定文字,则在该下拉框中选择“主文档”选项。这样要查找的指定文字就突出显示在文档中了。

    设置“查找和替换”对话框http://www.wdashi.com/ebtopdf
    展开全文
  • 怎样在Word中插入代码并保持样式不变 我们有时候需要在word中添加一段我们写的代码,但是把代码粘贴到word文档中之后就发现所有的代码的样子都变了,我们可以采用下边的...弹出的窗口中选择OpenDocument文本,之后会

    怎样在Word中插入代码并保持样式不变

    我们有时候需要在word中添加一段我们写的代码,但是把代码粘贴到word文档中之后就发现所有的代码的样子都变了,我们可以采用下边的方法来实现保持代码原来的样式和颜色高亮

    1.这种方法适合于讲VisualStudio中的代码粘贴到word文档中

        a.在word中选择插入选项卡,然后点击对象


        b.在弹出的窗口中选择OpenDocument文本,之后会弹出一个新的word窗口,将Visual Studio中的代码复制粘贴到这里保存关闭窗口即可

       

        c.效果图如下

       

    2.这种方法是用notepad++完成,效果非常好,其它的编辑器像sublime等应该也有类似的功能,我还没有试过。

        a.在notepad++打开写的代码,然后选择Plugins→NppExport→Copy all formats to clipboard,这样就能够把当前选中的代码保持最原始的样式复制粘贴到word中

                

         b.效果图如下

          

         如果直接在word中粘贴就是上边的效果,word会将检查出来的拼写错误用曲线表示出来,但是如果我们用上边的那种方法插入对象,然后再执行粘贴操作,我们就会看到下边的效果

          

    参考自:

    http://stackoverflow.com/questions/387453/how-do-you-display-code-snippets-in-ms-word-preserving-format-and-syntax-highlig
    展开全文
  • 在Word中很多位置上双击鼠标左键,都可以执行一些操作或打开某个对话框,具体如下:双击Word 2007主窗口左上角的【Office按钮】,可以直接关闭Word 2007程序。双击水平标尺空白处,将打开【页面设置】对话框。...
    Word中,在很多位置上双击鼠标左键,都可以执行一些操作或打开某个对话框,具体如下:
    • 双击Word 2007主窗口左上角的【Office按钮】,可以直接关闭Word 2007程序。
    • 双击水平标尺空白处,将打开【页面设置】对话框。双击垂直标尺,也可以打开【页面设置】对话框。
    • 双击水平标尺刻度附近,将打开【制表位】对话框。
    • 双击水平标尺上的缩进标记,将打开【段落】对话框。
    • 双击滚动条顶端用于拆分窗口的线框,可直接将窗口拆分为两部分。
    • 如果希望按照一个样板格式来为多个位置的内容设置相同格式,那么可以双击【开始】/【剪贴板】组中的【格式刷】命令,然后即可连续对多处内容设置格式。
    展开全文
  • Vue - element-ui 预览 word 、exce、ppt以及pdf文件

    万次阅读 多人点赞 2019-08-17 16:21:01
    最近写了个有 预览word 、Exce、ppt以及pdf文件 的后台 管理 网上也找了 很多 就感觉很复杂 ,当然最后还是实现了 , 本博一项喜欢简单 越简单越好 越好理解 废话不多说 先上效果图 (我就喜欢那种有图的代码 能...
  • 需求:用FindWindow获取了一个主窗口的句柄,如何能把它的全部子窗口的名字打印出来 获取父窗口句柄 HWND hWnddlg = AfxGetMainWnd()->m_hWnd; //主窗口句柄 或者 HWND hWnddlg = this->m_hWnd; //主窗口句柄...
  • MathType 6.9嵌入到Office(word)2016

    千次阅读 2019-05-15 22:39:55
    提醒:进行操作时不能在word外打开MathType的大窗口 打开word 视图-->宏-->录制宏-->修改宏名(假设修改为A)-->将宏保存所有文档(Normal.dotm) 插入-->对象-->对象-->“新建”...
  • 主窗口CMainDlg的定义很好理解,虽然简单但却至... 首先需定义3个控制成员变量m_tab、m_creator及m_about,分别对应主窗口中tab控制、Creator子窗口、About子窗口。  接着OnInitDialog方法中初始化Tab控制,创建C
  •  我们创建一个名叫WordTest的Windows窗体应用程序作为本次试验的工程,为了能够显示word中的内容,我们先要下图所示的Program.cs的main()函数引入控制台Console来显示读取到内容。   Program.cs的代码: n
  • 如何模拟《WORD》的窗口形式

    千次阅读 2002-03-27 08:56:00
    如何模拟《WORD》的窗口形式重点:CChildFrame上做文章。1、利用向导生成一个多文档应用程序 TestMDI,则生成下列类:CAboutDlg,CChildFrame,CMainFrame,CTestMDIApp,CTestMDIDoc,CTestMDIView2、改造CTestMDIApp:...
  • WORD中的vba批量转换为PDF

    千次阅读 2013-07-18 09:47:46
    转载自:licanli2082@126网易博客 对于只是简单运行的方法,步骤如下: 1. 让WORD2007、2010调出开发选项卡。调出的办法是,点击WORD左上角的圆圈形按钮,从下拉菜单中选择”...3. 窗口中输入一个宏名字(任...
  • C#利用自动化模型操纵Word

    千次阅读 2008-09-17 20:57:00
     引入程序集 工程加入引用Interop.Word 二. 生成Word对象 定义Word对象 Word.ApplicationClass app=null; 打开Word对象 if(app==null) app=new Word.ApplicationClass(); 显示Word应用程序
  • 一直有点没明白标题三者的关系,此记录下来自己查阅之后的看法,有不对的地方,请大家指正,谢谢! 关于NLP,有各种不同的表达,如:词向量、word embedding、分布式表示、word2vec、glove等等,这一锅粥的...
  • 安装了office2010之后,其他的如excel,ppt都可以,就只有word,运行后初始化界面出现了,过了一阵子界面也出现了,停留了半秒不到就消失了。 运行里输入 winword /a可以启动 解决:注册表这几个键值修改...
  • QT使用嵌入窗口

    千次阅读 2019-08-16 11:18:14
    文章目录需求实现1. 主界面中添加一个`treeWidget`2....在主窗口中, 左边显示树形结构, 元素是不同类型的节点, 要求根据节点类型不同主窗口右侧显示不同的控件内容 实现 这个功能MFC中实现不是...
  • Word 2010 的 VBA 入门

    千次阅读 2016-06-07 14:27:17
    本主题汇总了 VBA 语言、有关如何访问 Word 2010 的 VBA 的说明、实际 Word VBA 编程问题的详细解决方案以及有关如何编程和调试的提示。 上次修改时间: 2015年5月11日 适用范围: Office 2
  • 最近写一些报告,要用到不少表格和图,一开始不知道如何画柱状图和折线图的结合体,查了一番后搞定,记录下,以备日后翻阅。 ...这时都是以柱状图的形式出现,都是在主坐标轴。 2、修改“...
  • word技巧

    千次阅读 2018-03-01 21:40:22
    word 高效经典教程(整理版)目录一分钟驾驭word 高效经典教程(整理版)... 6A、基础知识... 61、度量单位... 62、WORD中文字字号与磅的对应关系... 63、字体文件格式... 7B、文本编辑... 71、快速移动文档... 72、...
  • [经验分享]破解Word中保护文档密码

    万次阅读 2018-05-28 22:08:12
    [经验分享]破解Word中保护文档密码 0X00起因 周五受到一个新的任务,需要对一些表格数据进行汇总, 没想到,最后一个文件,尽然有文档保护的密码 由于具有黑客天分的我(纯属吹牛哈)对文档进行了简单的弱口令...
  • 最近写大论文,导师给得众多的反馈之,有一点就是:“要求将word中由mathtype编辑的公式统一一下格式”。针对这一问题,起初是想一个一个调,但是一看我的大论文,六章共6w多字且公式多达百余个,所以此路肯定...
  • word 创建邮件及合并文档

    千次阅读 2009-07-21 16:25:00
    日常生活,经常需要处理大量的通用文档,这些文档的内容既有相同的部分,又有格式不同的标识部分。例如,开会时要发通知,通知的内容都是一样的,只有每个人的姓名和称呼不同。最笨的方法是大量复制文档,然后对...
  • ps:整理电脑文档,将之前的做的word2vec训练的中文模型实验记录做下poko,欢迎交流学习。1.准备数据与预处理注意事项:请将内存最好选择8g及以上的电脑,否则可能卡顿,并开始时候安装好python的使用环境,不仅是...
  • OLEPB数据窗口中的实现

    千次阅读 2006-05-18 20:25:00
    OLEPB数据窗口中的实现---- OLE(Object linking and Embedding), 即 对 象 连 接 与 嵌 入 简 称, 是 Windows 环 境 下 实 现不 同Windows 实 用 程 序 之 间 共 享 数 据 和 程 序 功 能 的 一 种 方法。 ...
  • ATL实现窗口

    千次阅读 2007-03-22 23:14:00
    一、实现对话框 ATL有三个模板类可用于创建一个对话框: (1)CSimpleDialog:创建模式对话框, 可以host Windows Controls template < WORD t_wDlgTemplateID, BOOL t_bCenter = TRUE >class CSimpleDialog : ...
  • Word中下划线自动换行版式不…

    千次阅读 2017-04-14 10:03:49
    原文地址:Word中下划线自动换行版式不变形作者:破烂小笔Word中编辑合同、协议、考卷、介绍信一类文档时,往往需要文本留出一定的空格并设置下划线以便填写。当这些空格出现在上一行末和下一行开头时,如果空格...
  • 目录 一、数据获取 二、将xml格式数据转为txt 三、繁体转为简体 方法1---自己使用opencc库手动了1个转换程序,pip install opencc进行安装 方法2---网上有一个exe应用程序进行...五、Word2Vec模型训练 六、W...
  • word文档筛选Email地址

    千次阅读 2010-03-26 19:36:00
    2、查找内容:[a-zA-Z0-9_/-.]{1,}/@[a-zA-Z0-9_/-.]{1,}3、选中“突出显示所有该范围找到的项目”,下面列表框选中“文档”;4、单击“高级”展开完整查找窗口;5、选中“使用通配符”;6、单击“查找全部”;7...
  • Word XPWord XP 目录的编制方法 1.单击要插入目录的位置。 2.指向"插入"菜单上的"引用",再单击"索引和目录"。 3.单击"目录"选项卡。 4.若要使用现有的设计,请"格式"框单击进行选择。 5.根据需要,选择...
  • 合并照片到word中

    千次阅读 2010-04-09 15:56:00
    1) 光标移至要插入的地方→插入→域→左边选中域名“IncludePictrue”→文件名输入“1”(可任意输入,随后将修改)→确定。 2) 文档中将出现照片显示位置,点击此位置→按SHIFT+F9显示域代码→拖黑代码...
  • Word 转手写体

    千次阅读 多人点赞 2020-06-20 13:07:43
    文章目录介绍与准备Tkinter 指南开发环境Word 转手写体代码程序背景图像字体下载与设置程序啦!!代码测试与结果链接 Word 文档从 Word 文档获取输入的代码新建一个 Word 测试文档代码调试代码运行准备GUI 设计...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 43,279
精华内容 17,311
关键字:

在word主窗口中