效果
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 <QMenu> #include <QMenuBar> #include <QAction> #include <QComboBox> #include <QFontComboBox> #include <QToolBar> #include <QToolButton> #include <QTextCharFormat> #include <QTextStream> #include <QPrinter> #include <QPrintDialog> #include <QTextDocument> #include <QPainter>#include "showwidget.h"class ImgProcessor : public QMainWindow {Q_OBJECTpublic:ImgProcessor(QWidget *parent = nullptr);~ImgProcessor();void createActions();//创建动作void createMenus();//创建菜单void createToolBars();//创建工具栏void loadFile(QString filename);void mergeFormat(QTextCharFormat format);protected slots:void ShowNewFile(); // 新建文件void ShowOpenFile(); // 打开文件void ShowPrintText();// 打印文件void ShowPrintImage(); //图像打印void ShowZoomIn(); //放大void ShowZoomOut(); // 缩小void ShowRotate90(); //旋转90度void ShowRotate180();//旋转180度void ShowRotate270();//旋转270度void ShowMirrorVertical(); // 纵向镜像void ShowMirrorHorizontal();// 横向镜像/* 文本相关:槽 */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 *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;/* 文本相关工具 */QLabel *fontLabel1;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 <QFile> #include <QTextStream> #include <QFileDialog> #include <QPrinter> #include <QColor> #include <QColorDialog> #include <QTextBlock> #include <QTextList>ImgProcessor::ImgProcessor(QWidget *parent): QMainWindow(parent) {setWindowTitle(tr("Easy Word")); //设置窗体标题showWidget = new ShowWidget(this);setCentralWidget(showWidget);// 在工具栏上嵌入控件//设置字体 p143fontLabel1 = 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("./images/bold.png"));boldBtn->setCheckable(true);italicBtn = new QToolButton;italicBtn->setIcon(QIcon("./images/italic.png"));italicBtn->setCheckable(true);underlineBtn = new QToolButton;underlineBtn->setIcon(QIcon("./images/underline.png"));underlineBtn->setCheckable(true);colorBtn = new QToolButton;colorBtn->setIcon(QIcon("./images/color.png"));colorBtn->setCheckable(true);/* 排版功能 */listLabel = new QLabel(tr("排序"));listComboBox = new QComboBox;listComboBox->addItem("QTextListFormat::ListDisc");listComboBox->addItem("QTextListFormat::ListCircle");listComboBox->addItem("QTextListFormat::ListSquare");listComboBox->addItem("QTextListFormat::ListDecimal");listComboBox->addItem("QTextListFormat::ListLowerAlpha");listComboBox->addItem("QTextListFormat::ListUpperAlpa");listComboBox->addItem("QTextListFormat::ListLowerRoman");listComboBox->addItem("QTextListFormat::ListUpperRoman");/*创建动作、菜单、工具栏的函数*/createActions();createMenus();createToolBars();if(img.load("image.png")){// 在imageLabel对象中放置图片showWidget->imageLabel->setPixmap(QPixmap::fromImage(img));}//新建文件connect(NewfileAction,SIGNAL(triggered()),this,SLOT(ShowNewFile()));connect(openFileAction,SIGNAL(triggered()),this,SLOT(ShowOpenFile()));connect(PrintTextAction,SIGNAL(triggered()),this,SLOT(ShowPrintText()));connect(PrintImageAction,SIGNAL(triggered()),this,SLOT(ShowPrintImage()));connect(zoomOutAction,SIGNAL(triggered()),this,SLOT(ShowZoomOut()));connect(zoomInAction,SIGNAL(triggered()),this,SLOT(ShowZoomIn()));connect(rotate90Action,SIGNAL(triggered()),this,SLOT(ShowRotate90()));connect(rotate180Action,SIGNAL(triggered()),this,SLOT(ShowRotate180()));connect(rotate270Action,SIGNAL(triggered()),this,SLOT(ShowRotate270()));connect(mirrorHorizontalAction,SIGNAL(triggered()),this,SLOT(ShowMirrorHorizontal()));connect(mirrorVerticalAction,SIGNAL(triggered()),this,SLOT(ShowMirrorVertical()));/* 事件关联 */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, SIGNAL(currentChartFormatChanged(QTextCharFormat&)),this,SLOT(ShowCurrentFormatChanged(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, SIGNAL(cursorPositionChanged()),this, SLOT(ShowCursorPositionChanged())); }ImgProcessor::~ImgProcessor() { }void ImgProcessor::createActions() {//“打开” 动作openFileAction = new QAction(QIcon("./images/open.png"),tr("打开"),this);openFileAction->setShortcut(tr("Ctrl+O"));openFileAction->setStatusTip(tr("打开一个文件"));NewfileAction = new QAction(QIcon("./images/new.png"),tr("新建"),this);NewfileAction->setShortcut(tr("Ctrl+N"));NewfileAction->setStatusTip(tr("新建一个文件"));exitAction= new QAction(QIcon("./images/exit.png"),tr("退出"),this);exitAction->setShortcut(tr("Ctrl+Q"));exitAction->setStatusTip(tr("退出程序"));connect(exitAction,SIGNAL(triggered()),this,SLOT(close()));copyAction = new QAction(QIcon("./images/copy.png"),tr("复制"),this);copyAction->setShortcut(tr("Ctrl+C"));copyAction->setStatusTip(tr("复制文件"));connect(copyAction,SIGNAL(triggered()),showWidget->text,SLOT(copy()));cutAction = new QAction(QIcon("./images/cut.png"),tr("剪切"),this);cutAction->setShortcut(tr("Ctrl+X"));cutAction->setStatusTip(tr("剪切文件"));connect(cutAction,SIGNAL(triggered()),showWidget->text,SLOT(cut()));pasteAction = new QAction(QIcon("./images/paste.png"),tr("粘贴"),this);pasteAction->setShortcut(tr("Ctrl+V"));pasteAction->setStatusTip(tr("粘贴文件"));connect(pasteAction,SIGNAL(triggered()),showWidget->text,SLOT(paste()));// ”“关于”“动作aboutAction = new QAction(QIcon("./images/about.png"),tr("关于"),this);connect(aboutAction, SIGNAL(triggered()),this, SLOT(QApplication::aboutQt()));//打印文件 动作PrintTextAction = new QAction(QIcon("./images/printText.png"),tr("打印文本"),this);PrintTextAction->setStatusTip(tr("打印一个文本"));//打印图片 动作PrintImageAction = new QAction(QIcon("./images/printImage.png"),tr("打印图片"),this);PrintImageAction->setStatusTip(tr("打印一幅图片"));zoomInAction = new QAction(QIcon("./images/zoomIn.png"),tr("放大"),this);zoomInAction->setStatusTip(tr("放大一幅图片"));zoomOutAction = new QAction(QIcon("./images/zoomOut.png"),tr("缩小"),this);zoomOutAction->setStatusTip(tr("缩小一幅图片"));rotate90Action = new QAction(QIcon("./images/rotate90.png"),tr("旋转90度"),this);rotate90Action->setStatusTip(tr("将一幅图片旋转90"));rotate180Action = new QAction(QIcon("./images/rotate180.png"),tr("旋转180度"),this);rotate180Action->setStatusTip(tr("将一幅图片旋转180"));rotate270Action = new QAction(QIcon("./images/rotate270.png"),tr("旋转270度"),this);rotate270Action->setStatusTip(tr("将一幅图片旋转270"));mirrorVerticalAction = new QAction(QIcon("./images/mirrorVertical.png"),tr("纵向镜像"),this);mirrorVerticalAction->setStatusTip(tr("对一幅图做纵向镜像"));mirrorHorizontalAction = new QAction(QIcon("./images/mirrorHorizontal.png"),tr("横向镜像"),this);mirrorHorizontalAction->setStatusTip(tr("对一幅图做横向镜像"));undoAction = new QAction(QIcon("./images/undo.png"),tr("撤销"),this);connect(undoAction,SIGNAL(triggered()),showWidget->text,SLOT(undo()));redoAction = new QAction(QIcon("./images/redo.png"),tr("重做"),this);connect(redoAction,SIGNAL(triggered()),showWidget->text,SLOT(redo()));/* 排序: 左对齐、右对齐、居中和两端对齐 */actGrp = new QActionGroup(this);leftAction = new QAction(QIcon("./images/left.png"),"左对齐",actGrp);leftAction->setCheckable(true);rightAction = new QAction(QIcon("./images/right.png"),"右对齐",actGrp);rightAction->setCheckable(true);centerAction = new QAction(QIcon("./images/center.png"),"居中",actGrp);centerAction->setCheckable(true);justifyAction = new QAction(QIcon("./images/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(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("镜像");mirrorMenu->addAction(mirrorVerticalAction);mirrorMenu->addAction(mirrorHorizontalAction);}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()); }void ImgProcessor::loadFile(QString filename) {// 读取文件内容功能printf("file Name:%s\n", (char*)filename.data());QFile file(filename);if(file.open(QIODevice::ReadOnly|QIODevice::Text)){QTextStream textStream(&file);while(!textStream.atEnd()){showWidget->text->append(textStream.readLine());printf("read line\n");}printf("end\n");} }void ImgProcessor::ShowNewFile() {// 新建文件功能ImgProcessor *newImgProcessor = new ImgProcessor;newImgProcessor->show(); }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);if(printDialog.exec()){// 获得QTextEdit对象的文档QTextDocument *doc = showWidget->text->document();doc->print(&printer);} }void ImgProcessor::ShowPrintImage() {// 实现打印图像功能QPrinter printer; //新建一个QPainter对象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.setWindow(img.rect()); // 设置QPainter窗口大小为图像的大小painter.drawImage(0,0,img);// 打印图像} }void ImgProcessor::ShowZoomIn() {// 实现图形放大功能if(img.isNull()){return;}QMatrix matrix;matrix.scale(2,2); //按照2倍比例对水平和垂直方向进行放大img = img.transformed(matrix);showWidget->imageLabel->setPixmap(QPixmap::fromImage(img)); }void ImgProcessor::ShowZoomOut() {// 实现图形缩小功能if(img.isNull()){return;}QMatrix matrix;matrix.scale(0.5,0.5);//按照0.5倍比例对水平和垂直方向进行缩水img = img.transformed(matrix);showWidget->imageLabel->setPixmap(QPixmap::fromImage(img)); }void ImgProcessor::ShowRotate90() {// 旋转90度if(img.isNull())return;QMatrix matrix;matrix.rotate(90);img=img.transformed(matrix);showWidget->imageLabel->setPixmap(QPixmap::fromImage(img)); }void ImgProcessor::ShowRotate180() {// 旋转180度if(img.isNull())return;QMatrix matrix;matrix.rotate(180);img=img.transformed(matrix);showWidget->imageLabel->setPixmap(QPixmap::fromImage(img)); } void ImgProcessor::ShowRotate270() {// 旋转270度if(img.isNull())return;QMatrix matrix;matrix.rotate(270);img=img.transformed(matrix);showWidget->imageLabel->setPixmap(QPixmap::fromImage(img)); }void ImgProcessor::ShowMirrorVertical() { // 图形的纵向镜像if(img.isNull())return;img = img.mirrored(false,true);showWidget->imageLabel->setPixmap(QPixmap::fromImage(img)); }void ImgProcessor::ShowMirrorHorizontal() {// 图形的横向镜像if(img.isNull())return;img = img.mirrored(true,false);showWidget->imageLabel->setPixmap(QPixmap::fromImage(img)); }void ImgProcessor::ShowFontComboBox(QString comboStr) {QTextCharFormat fmt;fmt.setFontFamily(comboStr);mergeFormat(fmt); }void ImgProcessor::ShowSizeSpinBox(QString spinValue) {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::ShowList(int index) {// 排序QTextCursor cursor = showWidget->text->textCursor();if(index!=0){QTextListFormat::Style style = QTextListFormat::ListDisc;switch(index){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;break;}/* 设置缩进值 */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);} }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::mergeFormat(QTextCharFormat format) {QTextCursor cursor = showWidget->text->textCursor();if(!cursor.hasSelection())cursor.select(QTextCursor::WordUnderCursor);cursor.mergeCharFormat(format);showWidget->text->mergeCurrentCharFormat(format); }
showwidget.h 代码:
#ifndef SHOWWIDGET_H #define SHOWWIDGET_H#include <QWidget> #include <QImage> #include <QLabel> #include <QTextEdit> #include <QHBoxLayout>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"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); }
在Qt5中,主窗体(MainWindow)是应用程序的核心组件,它通常承载着应用的主要功能和界面元素。在这个"文本编辑器"案例中,我们将深入探讨如何利用Qt5库来创建一个功能丰富的文本编辑器。Qt是一个跨平台的C++图形用户界面应用程序框架,提供了丰富的API来处理UI设计、事件处理以及与其他系统交互等功能。