十五、【文本编辑器(一)】代码框架

 


目录

一、QMainWindow基本构成

二、项目框架代码

三、菜单与工具栏的实现

四、总结


一、QMainWindow基本构成

        QMainWindow 是一个为用户提供主窗口程序的类,包含一个菜单栏 (menu bar),多个工具栏(tool bars),多个锚接部件 (dock widgets), 一个状态栏 ( status bar ) 及一个中 心部件 ( central widget),是许多应用程序的基础,如文本编辑器、图片编辑器等。

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

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

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

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

5、中心部件
        中心部件处在锚接部件区的内部、主窗口的中心,一个主窗口只有一个中心部件。

        为了控制主窗口工具栏和锚接部件的显隐,在默认情况下,QMainWindow 主窗口提供了一个上下文菜单(Context Menu)。通常,通过在工具栏或锚接部件上单击鼠标右键 就可以激活该上下文 菜单,也 可以通过函数 QMainWindow::createPopupMenu()激活该菜单。此外,还可以重写QMainWindow:createPopupMenu()函数,实现自定义的上下文菜单。

二、项目框架代码

        创建Qt项目时,项目名称为“ImageProcessor”,基类选择“QMainWindow”,类名为“ImgProcessor”,取消“创建界面”复选框的选中状态。工程的文件列表如下图:

 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 = 0);
    
    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);

    // 设置边框样式
    imageLabel->setStyleSheet("border: 1px solid black;");

    text =new QTextEdit;

    //设置布局
    QHBoxLayout *mainLayout =new QHBoxLayout(this);
    mainLayout->addWidget(imageLabel,1);
    mainLayout->addWidget(text,3);
}

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 = 0);
    ~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 *PrintTextAction;
    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;
};

imgprocessor.cpp

#include "imgprocessor.h"
#include <QFileDialog>
#include <QFile>
#include <QTextStream>
#include <QPrintDialog>
#include <QPrinter>
#include <QPainter>
#include <QColorDialog>
#include <QColor>
#include <QTextList>

ImgProcessor::ImgProcessor(QWidget *parent)
    : QMainWindow(parent)
{
    //设置标题
    setWindowTitle(tr("Easy Word"));

    showWidget =new ShowWidget(this);
    setCentralWidget(showWidget);


    //创建菜单栏
    createActions();
    createMenus();
    //创建工具栏
    createToolBars();

    if(img.load("image.png"))
    {
        showWidget->imageLabel->setPixmap(QPixmap::fromImage(img));
    }
}

三、菜单与工具栏的实现

        菜单与工具栏都与 QAction 类密切相关,工具栏上的功能按钮与菜单中的选项条目相对应,完成相同的功能,使用相同的快捷键与图标。QAction 类为用户提供了一个统一的命令接口,无论是从菜单触发还是从工具栏触发,或通过快捷键触发都调用同样的操作接口,以达到同样的目的。

1、动作(Action)的实现

void ImgProcessor::createActions()
{
    //"打开"动作
    openFileAction =new QAction(QIcon("open.png"),tr("打开"),this);
    //用于在组件上设置快捷键
    openFileAction->setShortcut(tr("Ctrl+O"));
    //用于设置一个状态提示
    openFileAction->setStatusTip(tr("open a file"));
    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(triggered()),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()));

    //"打印文本"动作
    PrintTextAction =new QAction(QIcon("printText.png"),tr("打印文本"), this);
    PrintTextAction->setStatusTip(tr("打印一个文本"));
    connect(PrintTextAction,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()));

    //实现图像旋转的动作(Action)
    //旋转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()));

    //实现图像镜像的动作(Action)
    //纵向镜像
    mirrorVerticalAction =new QAction(tr ("纵向镜像"),this);
    mirrorVerticalAction->setStatusTip(tr("对一张图作纵向镜像"));
    connect(mirrorVerticalAction,SIGNAL(triggered()),this,SLOT(ShowMirrorVertical()));

    //横向镜像
    mirrorHorizontalAction =new QAction(tr("横向镜像"),this);
    mirrorHorizontalAction->setStatusTip(tr("对一张图作横向镜像"));
    connect(mirrorHorizontalAction,SIGNAL(triggered()),this,SLOT(ShowMirrorHorizontal()));

    //排序:左对齐、右对齐、居中和两端对齐
    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*)));

    //实现撤销和重做的动作(Action)
    //撤销和重做
    undoAction =new QAction(QIcon("undo.png"),"撤销",this);
    connect(undoAction,SIGNAL(triggered()),showWidget->text,SLOT(undo()));
    redoAction =new QAction(QIcon("redo.png"),"重做",this);
    connect(redoAction,SIGNAL(triggered()),showWidget->text,SLOT(redo()));
}

        openFileAction =new QAction(QIcon(nopen.pngn),tr(MOpenn),this):在创建“打开文件”动作的同时,指定了此动作使用的图标、名称及父窗口。
        openFileAction->setShortcut(tr(nCtrl+OM)):设置此动作的组合键为【Ctrl+O】。
        openFileAction->setStatusTip(tr(nopen a ImageM)):设定了状态条显示,当鼠标光标移至此动作对应的菜单条目或工具栏按钮上时,在状态条上显示 “打开一个文件” 的提示。如果此函数在调用后未实现效果,可以尝试调用this->statusBar()->show()函数使之显示。效果如下图所示:

2、菜单(Menus)的实现

        在实现了各个动作之后,需要将它们通过菜单、工具栏或快捷键的方式体现出来,以下是菜单的实现函数 createMenus。代码:

void ImgProcessor::createMenus()
{
    //文件菜单
    fileMenu =menuBar()->addMenu(tr("文件"));
    fileMenu->addAction(openFileAction);
    fileMenu->addAction(NewFileAction);
    fileMenu->addAction(PrintTextAction);
    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);
}

        fileMenu =menuBarO->addMenu(tr(M 文件")):直接调用 QMainWindow 的menuBar( )函数即可得到主窗口的菜单条指针,再调用菜单条 QMenuBar 的addMenu( )函数,即可完成在菜单条中插入一个新菜单 fileMenu,fileMenu 为一个QMenu 类对象。
        fileMenu->addAction(…):调用 QMenu 的 addAction()函数在菜单中加入菜单条目 “Open”、“New”、"PrintText” 和 “PrintIamge”。
        类似地,实现缩放菜单、旋转菜单和镜像菜单。

3、工具栏(ToolBars)的实现


void ImgProcessor::createToolBars()
{
    //文件工具条
    fileTool =addToolBar("File");
    fileTool->addAction(openFileAction);
    fileTool->addAction(NewFileAction);
    fileTool->addAction(PrintTextAction);
    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(fontLabel1);
    fontToolBar->addWidget(fontComboBox);
    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());
}

        fileTool =addToolBar(nFilen):直接调用 QMainWindow 的 addToolBar()函数即可获得主窗口的工具条对象,每新增一个工具条调用一次 addToolBar()函数,赋予不同的名称,即可在主窗口中新增一个工具条。 
        fileTooI->addAction(…):调用 QToolBar 的 addAction()函数在工具条中插入属于本工具条的动作。类似地,实现“编辑工具条”、“旋转工具条”、“撤销和重做工具条”。 工具条的显示可以由用户进行选择,在工具栏上单击鼠标右键将弹出工具条显示的选择菜单,用户对需要显示的工具条进行选择即可。
        工具条是一个可移动的窗口,它可停靠的区域由 QToolBar 的 allowAreas 决定,包括Qt::LeftToolBarArea 、 Qt::RightToolBarArea 、 Qt::TopToolBarArea 、Qt::BottomToolBarArea 和 Qt::AlIToolBarAreas o 默认为 Qt::AllToolBarAreas, 启动后默认出现于主窗口的顶部。可通过调用setAllowAreas()函数来指定工具条可停靠
的区域,如:
        fileTool->setAllowedAreas(Qt::TopToolBarArea|Qt::LeftToolBarArea);
        此函数限定文件工具条只可出现在主窗口的顶部或左侧。工具条也可通过调用setMovableo函数设定可移动性,如:
        fileTool->setMovable(false);
        指定文件工具条不可移动,只出现于主窗口的顶部。

四、总结

        本文介绍了QMainWindow的基本构成并且梳理了文本编辑器的代码逻辑和框架,至于每一个详细的功能的实现会放在后续的章节进行详细的介绍。

        

  • 15
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值