QT:简易文本编辑器
效果
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_OBJECT public: 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); // 在工具栏上嵌入控件 //设置字体 p143 fontLabel1 = 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设计、事件处理以及与其他系统交互等功能。
优质生活从拆开始