Qt 富文本处理
富文本处理
所有的类围绕 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 富文本处理的更多相关文章
- Qt富文本编辑器QTextDocument
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt富文本编辑器QTextDocument 本文地址:https://www.tech ...
- Qt 富文本处理(QTextDocument和QTextBlock和QTextFrame和QTextTable和QTextList和QTextDocument)
最近使用 Qt 做一个离线博客编辑器,因而用到了 Qt 的富文本处理.参考 Qt 的文档,记录下 Qt 的富文本处理的相关技术.文档地址是 http://doc.qt.nokia.com/4.7/ri ...
- PyQt(Python+Qt)学习随笔:富文本编辑器QTextEdit功能详解
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.概述 QTextEdit是一个高级的所见即所得的文档查看器和编辑器 ...
- Qt之QTableView显示富文本
简述 对于QTableView中的显示,我们前面介绍过很多种,其中包括:文本.进度条.复选框等,今天我们介绍一下关于富文本的显示. 可能绝大多数小伙伴会通过QAbstractTableModel中的d ...
- 在线富文本编辑器FckEditor配置(.Net Framework 3.5)
进入FCKeditor文件夹,编辑 fckconfig.js 文件.1.上传设置 . var _FileBrowserLanguage = 'php' ; // a ...
- 富文本编辑器Simditor的简易使用
最近打算自己做一个博客系统,并不打算使用帝国cms或者wordpress之类的做后台管理!自己处于学习阶段也就想把从前台到后台一起谢了.好了,废话不多说了,先来看看富文本编辑器SimDitor,这里是 ...
- 个人网站对xss跨站脚本攻击(重点是富文本编辑器情况)和sql注入攻击的防范
昨天本博客受到了xss跨站脚本注入攻击,3分钟攻陷--其实攻击者进攻的手法很简单,没啥技术含量.只能感叹自己之前竟然完全没防范. 这是数据库里留下的一些记录.最后那人弄了一个无限循环弹出框的脚本,估计 ...
- 图解DevExpress RichEditControl富文本的使用,附源码及官方API
9点半了,刚写到1.2. 该回家了,明天继续写完. 大家还需要什么操作,留言说一下,没有的我明天继续加. 好久没有玩DevExpress了,今天下载了一个玩玩,发现竟然更新到14.2.5了..我去 ...
- jsp富文本图片和数据上传
好记性不如烂笔头,记录一下. 2016的最后一天,以一篇博客结尾迎接新的一年. 此处用的富文本编辑器是wangEditor,一款开源的轻量级的富文本编辑器,这里着重说一下里面的图片上传功能. 服务器端 ...
随机推荐
- 64位平台支持大于2 GB大小的数组
64位平台支持大于2 GB大小的数组 64位平台.NET Framework数组限制不能超过2GB大小.这种限制对于需要使用到大型矩阵和向量计算的工作人员来说,是一个非常大问题. 无论RAM容量有多大 ...
- sqlclr创建表值函数案例
----------------------------------------------:定义表值类型:(1.一定返回的是IEnumerable2.一定带参数3.一定有FillRowMethodN ...
- QMVC
高性能.NET MVC之QMVC! ASP.NET!这个词代表者一个单词Fat!因为他总是捆绑着太多的太多的类,太多太多的各种功能!你也许会用到,如果你反编译或阅读他们开源的源码,你会不会犹如在大海中 ...
- 使用POI导出excel
引言:对于excel的导出,首先是将数据写到WorkBook中,然后将book以流的形式写出即可,看代码: public void exportResultInfo(String fileName,S ...
- twisted学习笔记No.3 Web Clients
原创博文,转载请注明出处. 这一章我们学习利用twisted建立web 客户端. twisted.web.client.getPage用来异步下载一个页面,并且返回一个deferred from tw ...
- [转]Mac OS X local privilege escalation (IOBluetoothFamily)
Source: http://joystick.artificialstudios.org/2014/10/mac-os-x-local-privilege-escalation.html Nowad ...
- springmvc国际化 基于请求的国际化配置
springmvc国际化 基于请求的国际化配置 基于请求的国际化配置是指,在当前请求内,国际化配置生效,否则自动以浏览器为主. 项目结构图: 说明:properties文件中为国际化资源文件.格式相关 ...
- JS的基本概念
JS的基本概念 任何语言的核心都必然会描述这门语言最基本的工作原理.而描述的内容通常都要涉及这门语言的语法,操作符,数据类型,内置功能等用于构建复杂解决方案的概念.Ecma-262通过叫做EcmaSc ...
- visio UML用例里面找不到include关系
今天用Microsoft Visio 2007画用例图时,发现visio UML用例里面找不到include关系,查到一个可行的解决办法: 1)创建一个UML用例图模板:打开Microsoft Vi ...
- Mathematics for Computer Graphics
Mathematics for Computer Graphics 最近严重感觉到数学知识的不足! http://bbs.gameres.com/showthread.asp?threadid=105 ...