富文本处理

所有的类围绕 QTextDocument 展开, 它保证了用户可以创建和修改 富文本块, 而无须定义中间语言。
一个 QTextDocument 可以通过两个接口操作, 一个是用于编辑的 Cusor based 接口, 一个是只读的文档结构树。

Rich Text Document Structure

QTextDocument 是一个文档的抽象, 它包括了文档的内部结构, 并且能够通过跟踪变化以提供 undo / redo 操作。
Qt通过 block frame table 以及其他类的树状结构表示文档。 Frame 和 table 用于组织其它结构, 而 block 包含实际内容。

QDocument 可以从 QTextEdit 中获取, 也可以是用默认构造。 这样可以保证 控件和 document的轻耦合。 一个空的文档包括了一个 root frame , 它包括了一个空的block 。 table 是 frame 的一个 子类, 它的行和列都可以单独包含 block。

  • Block 包含 fragment, 每一个fragment 都包含了 文字 和 字符的格式信息。文字格式信息包含于 block 和 character 两个层面。
  • Character 包含了字体、文字颜色、字体加粗等信息, block 包含了 文字方向、排版以及背景色等信息。
  • Image 使用 fragment 表示。

QTextObject 的子类可以归并文档元素: QTextBlockGroup 可以归并 block; QTextFrame 可以归并 block 以及其它 元素。

一个frame 结构可以包括 多个 或者0个 frame,至少1个block; 它的 format 决定了frame在 页面上如何被渲染和定位。使用 iterator 可以遍历frame 结构,但是要注意 iterator 的数据类型是不确定的。

QTextList 是 QTextBlockGroup 的一个子类, 它并不是 把 list item 当作它的子元素, 而是提供了一系列用于操作list item的函数。 可以如下使用

QTextFrame::iterator it;
for (it = frame->begin(); !(it.atEnd()); ++it) {
QTextBlock block = it.currentBlock();
if (block.isValid()) {
QTextList *list = block.textList();
if (list) {
int index = list->itemNumber(block);
processListItem(list, index);
}
}
}

The QTextCursor Interface

Cursor 可以通过一个构造函数创建, 也可以在 edit widget 中获取。

cursor 可以以 block 为单位, 保存选区信息。

一个 document 里面可以有多个 cursor, 但是只有一个是可见的; paste 和 copy操作就是这样实现的。 通过简单的继承, 可以实现很多复杂的操作。

Cursor 能够追踪它在 document 中的位置, 以及所在结构。

cursor一系列的 edit可以被打包, 这样能够在 redo 和 undo 中把它作为一个操作看待。一般使用 beginEditBlock 开始, endEditBlock 结束。

Cursor 的insert 有两个级别。 分别是 block 级别, 和 document级别。 Block级别可以插入 block 、 fragment 、 image 、text等; document 级别 插入 frame 、 table、 list, 这个级别的插入会在当前 frame 内、 当前block 以后。

可以在当前块中插入 当前文字格式 的字符串, 也可以插入自定义字符格式的字符串; 一旦在使用cursor 插入时使用了一个格式,那么这个格式会成为以后的 cursor 插入的默认格式,除非使用一个新的格式(替代了它)。

cursor.insertText(tr("Character formats"),headingFormat);
cursor.insertBlock();
cursor.insertText(tr("Text can be displayed in a variety of "
"different character formats. "), plainFormat);
cursor.insertText(tr("We can emphasize text by "));
cursor.insertText(tr("making it italic"), emphasisFormat);

Document Layouts
Document Layout 仅仅在文档的展示、需要展示的变化发生时有意义。

QAbstractTextDocumentLayout 是文档中管理所有 text layout 的抽象类。

富文本处理过程概述

常规的文本操作包括, 使用 QTextEdit 和 QTextBrowser 编辑文档, 使用QTextDocument 创建文档, 使用 QTextCursor 编辑文档, 以及打印等。

QTextBrowser 提供对有超链接文本的展示。 如果在文末使用 #anchor, 在文本滚动显示时会自动加载 anchor 所指内容。

QTextDocument 的查找是基于 QCursor 的。 如下:

QTextCursor newCursor(document);
while (!newCursor.isNull() &&!newCursor.atEnd()) {
newCursor = document->find(searchString, newCursor);
if (!newCursor.isNull()) {
newCursor.movePosition(QTextCursor::WordRight,
QTextCursor::KeepAnchor);
newCursor.mergeCharFormat(colorFormat);
}
}

Printing
QTextEdit 用于展示大文件在屏幕上可读的部分, 使用和 web 浏览器相同的方法去渲染。 它没有分页的功能。

QTextDocument 提供了 print 函数, 以下代码展示了如何使用 QPrinter 打印。

QTextDocument*document = editor->document();
QPrinter printer;
QPrintDialog*dlg =newQPrintDialog(&printer,this);
if (dlg->exec() !=QDialog::Accepted)
return;
document->print(&printer);

Advanced Rich Text Processing
Qt 在处理文字时没有对文件大小做出限制,因此这有可能导致你的应用在加载文件时失去响应。 也有一些其它问题也会导致程序的性能降低。 因此有以下几个规则。

把大的段落分割成较小的段落。

把 文件中 block 的数目限制在 maximumBlockCount() 以内。

以块为单位把文档加载到 text edit, 如下。 因为很多时候text edit 都没有必要加载一整个文档。

textEdit.show();
textCursor.beginEditBlock();
for (int i =0; i <1000; ++i) {
textCursor.insertBlock();
textCursor.insertText(paragraphText.at(i));
}
textCursor.endEditBlock();

Supported HTML Subset

Qt 的 text widgets支持html4的语法子集, 具体可以参考 Qt Mannual - Supported HTML Subset 。

Qt 富文本处理的更多相关文章

  1. Qt富文本编辑器QTextDocument

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt富文本编辑器QTextDocument     本文地址:https://www.tech ...

  2. Qt 富文本处理(QTextDocument和QTextBlock和QTextFrame和QTextTable和QTextList和QTextDocument)

    最近使用 Qt 做一个离线博客编辑器,因而用到了 Qt 的富文本处理.参考 Qt 的文档,记录下 Qt 的富文本处理的相关技术.文档地址是 http://doc.qt.nokia.com/4.7/ri ...

  3. PyQt(Python+Qt)学习随笔:富文本编辑器QTextEdit功能详解

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.概述 QTextEdit是一个高级的所见即所得的文档查看器和编辑器 ...

  4. Qt之QTableView显示富文本

    简述 对于QTableView中的显示,我们前面介绍过很多种,其中包括:文本.进度条.复选框等,今天我们介绍一下关于富文本的显示. 可能绝大多数小伙伴会通过QAbstractTableModel中的d ...

  5. 在线富文本编辑器FckEditor配置(.Net Framework 3.5)

    进入FCKeditor文件夹,编辑 fckconfig.js 文件.1.上传设置  .  var _FileBrowserLanguage         = 'php' ;         // a ...

  6. 富文本编辑器Simditor的简易使用

    最近打算自己做一个博客系统,并不打算使用帝国cms或者wordpress之类的做后台管理!自己处于学习阶段也就想把从前台到后台一起谢了.好了,废话不多说了,先来看看富文本编辑器SimDitor,这里是 ...

  7. 个人网站对xss跨站脚本攻击(重点是富文本编辑器情况)和sql注入攻击的防范

    昨天本博客受到了xss跨站脚本注入攻击,3分钟攻陷--其实攻击者进攻的手法很简单,没啥技术含量.只能感叹自己之前竟然完全没防范. 这是数据库里留下的一些记录.最后那人弄了一个无限循环弹出框的脚本,估计 ...

  8. 图解DevExpress RichEditControl富文本的使用,附源码及官方API

    9点半了,刚写到1.2.   该回家了,明天继续写完. 大家还需要什么操作,留言说一下,没有的我明天继续加. 好久没有玩DevExpress了,今天下载了一个玩玩,发现竟然更新到14.2.5了..我去 ...

  9. jsp富文本图片和数据上传

    好记性不如烂笔头,记录一下. 2016的最后一天,以一篇博客结尾迎接新的一年. 此处用的富文本编辑器是wangEditor,一款开源的轻量级的富文本编辑器,这里着重说一下里面的图片上传功能. 服务器端 ...

随机推荐

  1. vs 中一些快捷键

    本文用于记录一些vs中快捷键,以便提高编程效率. 首先小坦克的博客介绍的十几个快捷键挺不错的,还有动画演示.可以跳过去看看. 自己也记录一些自己想用的吧: 1. ctr + W + E 出现error ...

  2. DBMS_LOB包的使用

    DBMS_LOB包的使用 1.  dbms_lob.append( dest_lob  IN  OUT  NOCOPY  BLOB, src_lob  IN  BLOB) dbms_lob.appen ...

  3. wcf实例模型(随记)

    -----------------------------------------实例模型: 1.InstanceContentextMode: -------PerCall(单调):无状态,每次调用 ...

  4. VS2013 Update 2正式发布 .NET Framework“云优先、移动优先”

    2013 Update 2正式发布 .NET Framework“云优先.移动优先” 投递人 itwriter 发布于 2014-05-13 12:33 评论(19) 有2155人阅读  原文链接   ...

  5. 应该熟知的表单js应用(select、label、submit)

    前言  首先需要清楚的是,表单传数据方式,有POST和GET的方式,通过name和对应的value值提交到后台.通过name,可以用对象属性调用的方式获取对应的input标签,如: document. ...

  6. C++反汇编与逆向分析技术揭秘

    C++反汇编-继承和多重继承   学无止尽,积土成山,积水成渊-<C++反汇编与逆向分析技术揭秘> 读书笔记 一.单类继承 在父类中声明为私有的成员,子类对象无法直接访问,但是在子类对象的 ...

  7. AMQP(Advanced Message Queuing Protocol)

    一套确定的消息交换功能,也就是“高级消息交换协议模型”.AMQP模型包括一套用于路由和存储消息的功能模块,以及一套在这些模块之间交换消息的规则. 一个网络线级协议(数据传输格式),客户端应用可以通过这 ...

  8. 任务分配book

    上次写某道findpath的时候,没有写个二分答案没有过,之后就发现自己貌似一开始学分治那一块的时候就没有把二分学好....就打算重新回顾一下 这道题还算水,就是太久没有写模拟wa了3次....对自己 ...

  9. 园 首页 新随笔 联系 管理 订阅 订阅 RTSP协议转换RTMP直播协议

    RTSP协议转换RTMP直播协议 RTSP协议也是广泛使用的直播/点播流媒体协议,最近实现了一个RTSP协议转换RTMP直播协议的程序,为的是可以接收远端设备或服务器的多路RTSP直播数据,实时转换为 ...

  10. EF POWER TOOLS由数据库逆向CODE FIRST

    EF POWER TOOLS由数据库逆向CODE FIRST 前言 利用db first的开发方式有很多可供选择的方案,一种可以用ado.net实体框架模型,由向导直接生成edmx,并生成数据库上下文 ...