Qt中富文本处理

富文本处理

富文本(Rich Text)或者叫做富文本格式,简单来说就是在文档中可以使用多种格式,比如字体颜色、图片和表格等等。它是与纯文本(Plain Text)相对而言的,比如Windows上的记事本就是纯文本编辑器,而Word就是富文本编辑器。

  • 富文本文档结构
  • 文本块
  • 表格、列表与图片
  • 查找功能
  • 语法高亮与HTML

1 富文本文档结构

在Qt中提供了对富文本处理的支持。Qt中对富文本的处理分为了编辑操作和只读操作两种方式。

  • 编辑操作是使用基于光标的一些接口函数,这样更好的模拟了用户的编辑操作,更加容易理解,而且不会丢失底层的文档框架。
  • 而对于文档结构的概览,使用了只读的分层次的接口函数,它们有利于文档的检索和输出。

对于文档的读取和编辑要使用不同方面的两组接口。

  • 文档的光标主要基于QTextCursor类
  • 文档的框架主要基于QTextDocument类

一个富文本文档的结构被分为了几种元素来表示:

  • 框架(QTextFrame)
  • 文本块(QTextBlock)
  • 表格(QTextTable)
  • 列表(QTextList)

每种元素的格式又使用相应的format类来表示:

  • 框架格式(QTextFrameFormat)
  • 文本块格式(QTextBlockFormat)
  • 表格格式(QTextTableFormat)
  • 列表格式(QTextListFormat)

这些格式一般在编辑文档时使用,所以它们常和QTextCursor类配合使用。

因为QTextEdit类就是一个富文本编辑器,所以在构建QTextEdit类的对象时就已经构建了一个QTextDocument类对象和一个QTextCursor类对象,只需调用它们进行相应的操作即可。

一个空的文档包含了一个根框架(Root frame),这个根框架又包含了一个空的文本块(Block)。框架将一个文档分为多个部分,在根框架里可以再添加文本块、子框架和表格等。

  

设置根框架

 1 QTextDocument *document = ui->textEdit->document(); //获取文档对象
 2
 3 QTextFrame *rootFrame = document->rootFrame();      // 获取根框架
 4
 5 QTextFrameFormat format;                            // 创建框架格式
 6
 7 format.setBorderBrush(Qt::red);                     // 边界颜色
 8
 9 format.setBorder(3);                                // 边界宽度
10
11 rootFrame->setFrameFormat(format);                  // 框架使用格式

添加子框架

 1 QTextFrameFormat frameFormat;
 2
 3 frameFormat.setBackground(Qt::lightGray);                // 设置背景颜色
 4
 5 frameFormat.setMargin(10);                               // 设置边距
 6
 7 frameFormat.setPadding(5);                               // 设置填衬
 8
 9 frameFormat.setBorder(2);
10
11 //设置边框样式
12 frameFormat.setBorderStyle(QTextFrameFormat::BorderStyle_Dotted);
13
14 QTextCursor cursor = ui->textEdit->textCursor();         // 获取光标
15
16 cursor.insertFrame(frameFormat);                         // 在光标处插入框架

2 文本块

文本块QTextBlock类为文本文档QTextDocument提供了一个文本片段(QTextFragment)的容器。

一个文本块可以看做是一个段落,但是它不能使用回车换行,因为一个回车换行就表示创建一个新的文本块。QTextBlock提供了只读接口,它是前面提到的文档分层次的接口的一部分,如果QTextFrame看做是一层,那么其中的QTextBlock就是另一层。

文本块的格式由QTextBlockFormat类来处理,它主要涉及对齐方式,文本块四周的边白,缩进等内容。而文本块中的文本内容的格式,比如字体大小、加粗、下划线等内容,则由QTextCharFormat类来设置。

遍历框架

 1 QTextDocument *document = ui->textEdit->document();
 2     QTextFrame *frame = document->rootFrame();
 3     QTextFrame::iterator it;                       // 建立QTextFrame类的迭代器
 4     for (it = frame->begin(); !(it.atEnd()); ++it) {
 5          QTextFrame *childFrame = it.currentFrame();// 获取当前框架的指针
 6          QTextBlock childBlock = it.currentBlock(); // 获取当前文本块
 7          if (childFrame)
 8              qDebug() << "frame";
 9          else if (childBlock.isValid())
10              qDebug() << "block:" << childBlock.text();
11     }

遍历子框架

1 QTextDocument *document = ui->textEdit->document();
2     QTextBlock block = document->firstBlock();    // 获取文档的第一个文本块
3     for (int i = 0; i < document->blockCount(); i++) {
4         qDebug() << tr("文本块%1,文本块首行行号为:%2,长度为:%3,内容为:")
5                     .arg(i).arg(block.firstLineNumber()).arg(block.length())
6                     << block.text();
7         block = block.next();                         // 获取下一个文本块
8     }

 1 QTextCursor cursor = ui->textEdit->textCursor();
 2 QTextBlockFormat blockFormat;      // 文本块格式
 3 blockFormat.setAlignment(Qt::AlignCenter); // 水平居中
 4 cursor.insertBlock(blockFormat);   // 使用文本块格式
 5 QTextCharFormat charFormat;// 字符格式
 6 charFormat.setBackground(Qt::lightGray);   // 背景色
 7 charFormat.setForeground(Qt::blue);// 字体颜色
 8 // 使用宋体,12号,加粗,倾斜
 9 charFormat.setFont(QFont(tr("宋体"), 12, QFont::Bold, true));
10 charFormat.setFontUnderline(true); // 使用下划线
11 cursor.setCharFormat(charFormat);  // 使用字符格式
12 cursor.insertText(tr("测试字体")); // 插入文本

3 表格、列表和图片

 1 //插入表格
 2     QTextCursor cursor = ui->textEdit->textCursor();
 3     QTextTableFormat format;          // 表格格式
 4     format.setCellSpacing(2);         // 表格外边白
 5     format.setCellPadding(10);        // 表格内边白
 6     cursor.insertTable(2, 2, format); // 插入2行2列表格
 7 //插入列表
 8    QTextListFormat format;           // 列表格式
 9     format.setStyle(QTextListFormat::ListDecimal);   // 数字编号
10     ui->textEdit->textCursor().insertList(format);
11 //插入图片
12     QTextImageFormat format;          // 图片格式
13     format.setName("logo.png");       // 图片路径
14     ui->textEdit->textCursor().insertImage(format);

4 查找功能

 1 //查找文本
 2    QDialog *dlg = new QDialog(this);         // 创建对话框
 3     lineEdit = new QLineEdit(dlg);            // 创建行编辑器
 4     QPushButton *btn = new QPushButton(dlg);  // 创建按钮
 5     btn->setText(tr("查找下一个"));
 6     connect(btn,SIGNAL(clicked()),this,SLOT(findNext())); // 关联信号和槽
 7     QVBoxLayout *layout = new QVBoxLayout;    // 创建垂直布局管理器
 8     layout->addWidget(lineEdit);              // 添加部件
 9     layout->addWidget(btn);
10     dlg->setLayout(layout);                   // 在对话框中使用布局管理器
11     dlg->show();
12
13 //查找下一个
14    QString string = lineEdit->text();
15     // 使用查找函数查找指定字符串,查找方式为向后查找
16     bool isfind = ui->textEdit->find(string, QTextDocument::FindBackward);
17     if(isfind){                // 如果查找成功,输出字符串所在行和列的编号
18         qDebug() << tr("行号:%1 列号:%2")
19                     .arg(ui->textEdit->textCursor().blockNumber())
20                     .arg(ui->textEdit->textCursor().columnNumber());
21     }

5 语法高亮

在使用Qt Creator编辑代码时可以发现,输入关键字时会显示不同的颜色,这就是所谓的语法高亮。

在Qt的富文本处理中提供了QSyntaxHighlighter类来实现语法高亮。为了实现这个功能,需要创建QSyntaxHighlighter类的子类,然后重新实现highlightBlock()函数,使用时直接将QTextDocument类对象指针作为其父部件指针,这样就可以自动调用highlightBlock()函数了。

例如,自定义的类为MySyntaxHighlighter,像这样来使用:      highlighter = new MySyntaxHighlighter(ui->textEdit->document());      这里创建了MySyntaxHighlighter类的对象,并且使用编辑器的文档对象指针作为其参数,这样,每当编辑器中的文本改变时都会调用highlightBlock()函数来设置语法高亮。

重新实现highlightBlock()函数:

 1 QTextCharFormat myFormat;             // 字符格式
 2      myFormat.setFontWeight(QFont::Bold);
 3      myFormat.setForeground(Qt::green);
 4      QString pattern = "\\bchar\\b";       // 要匹配的字符,这里是“char”单词
 5      QRegExp expression(pattern);          // 创建正则表达式
 6      int index = text.indexOf(expression); // 从位置0开始匹配字符串
 7      // 如果匹配成功,那么返回值为字符串的起始位置,它大于或等于0
 8      while (index >= 0) {
 9          int length = expression.matchedLength(); // 要匹配字符串的长度
10          setFormat(index, length, myFormat);      // 对要匹配的字符串设置格式
11          index = text.indexOf(expression, index + length); // 继续匹配
12      }
13 在这里主要是使用了正则表达式和QString类的indexOf()函数来进行字

在这里主要是使用了正则表达式和QString类的indexOf()函数来进行字符串的匹配,如果匹配成功,则使用QSyntaxHighlighter类的setFormat()函数来设置字符格式。

6 HTML

在富文本处理中还提供了对HTML子集的支持,可以在QLabel或者QTextEdit添加文本时使用HTML标签或者CSS属性,例如:

ui->textEdit->append(tr("<h1><font color=red>使用HTML</font></h1>"));  

这里往编辑器中添加了文本,并且使用了HTML标签,

本文链接:https://blog.csdn.net/qq_40732350/article/details/86696217

原文地址:https://www.cnblogs.com/mtn007/p/11854549.html

时间: 2024-11-02 14:09:04

Qt中富文本处理的相关文章

Qt限制文本框输入的方法(使用QRegExpValidator,为QLineEdit所独有)

在做界面编程的时候,对文本框的处理往往是个很头疼的事情,一是焦点进入文本框时,从人性化考虑,应选择文本框中文本,方便输入:二是,限制文本框的输入,只允许输入有效的文本,如果不这样做的话,那么就需要在程序中滤去非法输入.在这里介绍一种解决上述两个问题的方法: [cpp] view plain copy #ifndef _EDIT_H #define _EDIT_H #include <qlineedit.h> class CEdit : public QLineEdit { Q_OBJECT p

使用Qt开发文本编辑器(一):功能介绍

以前一直很羡慕别人能开发文本编辑器,后来学了Qt,看了里面的例子,自己改造一下,竟也可以弄一个出来,虽然说不是很强大,权当是自己的一个学习成果吧.好了,我就废话少说,直接转入正题了.这个文本编辑器主要实现了以下功能: (1)文本编辑(包括撤销.恢复.保存.打开文件.导出成pdf.另存为等等). (2)Tab页式文档. (3)行号显示. (4)编辑内容转换为大写或小写. (5)字体改变. (6)编辑器设置. (7)转到指定行. 下面是截图: 源代码的下载地址:http://down.51cto.c

qt读取文本

直接 代码: 1 // lyy : 2016/8/26 16:40:11 说明:读取文本 2 bool FileOpeartion:: GetTheTextContent (const QString strPath, QStringList &strContent) 3 { 4 QFile file (strPath); 5 6 if (file.open (QIODevice::ReadOnly | QIODevice::Text)) 7 { 8 QTextStream in (&fi

django中富文本编辑器KindEditor的基本使用

1.简介: KindEditor 是一套开源的在线HTML编辑器,主要用于让用户在网站上获得所见即所得编辑效果,开发人员可以用 KindEditor 把传统的多行文本输入框(textarea)替换为可视化的富文本输入框. KindEditor 使用 JavaScript 编写,可以无缝地与 Java..NET.PHP.ASP 等程序集成,比较适合在 CMS.商城.论坛.博客.Wiki.电子邮件等互联网应用上使用 2.主要特点: 快速:体积小,加载速度快 开源:开放源代码,高水平,高品质 底层:内

页面中富文本的使用

1.引包 <script>window.UEDITOR_HOME_URL = "${base}/common/ueditor/";</script> <script type="text/javascript" src="${base}/common/js/jquery.form.min.js" ></script> <script type="text/javascript&quo

使用ivx中富文本组件的经验总结

富文本相比普通文本可以显示复杂的字体样式和排版方式,所以更适用于网页图文内容的排版,在很多案例中都会经常使用.ivx中也封装好了富文本组件和富文本编辑器组件,今天就说一下这两个组件该如何使用吧. 一.富文本和富文本编辑器富文本编辑器是一种可内嵌于浏览器,用于编辑富文本内容和格式的文本编辑器.它与富文本的区别是,前者仅容许在案例编辑状态下进行内容编辑,在非编辑状态下隐藏文本工具条,通常仅做展示,不与用户发生交互.后者则在案例非编辑状态下开放富文本编辑界面,容许用户进行富文本的排版和编辑.富文本组件

Qt绘制文本二 弧形路径 正弦函数路径

void WgtText::paintEvent(QPaintEvent *event) { QPainter painter(this); QString m_string("abcdefghijklmnopqrstuvwxy"); int font_size = 15; float x0 = font_size * m_string.count() * 0.5; int YSize = font_size * m_string.count() * 0.5; for(int i=0;

flutter中富文本

RichText( text: TextSpan( text: "登录代表同意", style: TextStyle( color: Styles.rgb_color_666, fontSize: Styles.textsize_13), children: [ TextSpan( text: "<***用户协议>", style: TextStyle( color: Styles.rgb_color_FFF36E22, fontSize: Styles

Python游戏引擎开发(四):TextField文本类

上一章我们主要介绍了显示对象和如何显示图片.本章来讲述显示文本. 以下是本系列教程前几章地址,在阅读本篇正文之前,请务必阅读前几章内容. Python游戏引擎开发(一):序 Python游戏引擎开发(二):创建窗口以及重绘界面 Python游戏引擎开发(三):显示图片 文本类TextField 使用过flash的朋友都知道,这个类其实不光是显示文本用的,还可以用于显示输入框.我这里就只实现一些基础实用的功能,以后有时间了慢慢拓展.和上一章一样,TextField是一个显示对象,继承自Displa