zoukankan      html  css  js  c++  java
  • Qt 富文本处理(一)

    Qt 富文本处理(一)

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://devbean.blog.51cto.com/448512/442632
     
     

    最近使用 Qt 做一个离线博客编辑器,因而用到了 Qt 的富文本处理。参考 Qt 的文档,记录下 Qt 的富文本处理的相关技术。文档地址是 http://doc.qt.nokia.com/4.7/richtext.html,本文不是文档的准确翻译,但是内容和文档是基本一致的。

    新版本 Qt 使用 QTextDocument 类作为富文本处理的中心类。相比之下,老版本则是使用基于文本的标记语言。

    现在,Qt 操作文档的接口可以分成两类:基于光标的接口(cursor-based interface)用于编辑,只读的层次接口(read-only hierarchical interface)用于提供文档结构的概览。基于光标的编辑的主要优点是,能够自然地模拟用户使用编辑器进行编辑的过程,不会丢失文档的底层结构;而只读的层次接口则有利于对于文档检索和导出。

    富文本文档结构

    富文本文档由 QTextDocument 类描述。这个类包含了文档的内部表示、结构,并且内置了 redo/undo 等操作的支持。

    文档的结构化表示描述了它包含的文本块(text block)、框架(frame)、表格(table)以及其他元素的层次化信息。这提供了文档的逻辑结构以及展现其内容的方式。一般的,框架和表格用于组织其他结构,而文本块则包含真正的文本信息。

    新元素的创建和插入可以通过使用 QTextCursor 以编程的方式实现,或者通过 QTextEdit 以用户可视化编辑的方式实现。元素可以在创建时指定一个特定的样式,或者是直接使用当前光标所在位置的样式。

    下图给出了文档结构的示例。

    文档的基本结构是:文档的“顶层”决定显示的方式布局。每一个文档都包括一个根框架(root frame),以及至少一个文本块。对于含有多种文本内容的文档,根框架通常会包含一系列的块和其他元素。在文档中,框架和表格的顺序由文本块分隔开。有时候这些文本块根本没有内容。这保证了新元素总是能够插进原有结构之间。

    富文本文档

    QTextDocument 类包含了富文本文档的所有信息。前面说过,文档可以用两种方式访问:方便编辑器使用的线性缓存(linear buffer)和方便布局引擎使用的对象层次(object hierarchy)。在层次化文档模型中,对象用来描述可视元素,如框架、表格和列表。在更低的层次上,这些元素都有自己的描述属性,如文本风格和对齐方式。文档的线性描述则用于编辑和维护文档内容。

    虽然 QTextEdit 提供了方便的富文本显示和编辑的功能,但文档也可以脱离任何一种编辑组件独立使用。例如:

    1. QTextDocument *newDocument = new QTextDocument; 

    另外,也可以通过已有的文本组件获得:

    1. QTextEdit *editor = new QTextEdit; 
    2. QTextDocument *editorDocument = editor->document(); 

    这种灵活性使得应用程序能够同时操作多个文档,而不必包含多个文档组件,也不比要求文档必须存储为某种中间格式。

    一个空的文档包含一个根框架,这个框架包含一个空的文本块。框架提供不同文档部分的逻辑分割,同时也提供了在渲染时如何显示的属性。一个表格就是一个特化的框架,包含分布在不同行和列的多个单元。每个单元都能够包含更多的结构和文本。表格提供了灵活配置单元的管理和布局的特性。

    文本块包含文本片段。每一个文本片段都有特定的文本和字符格式信息。文本属性在字符级别和块级别定义。在字符级别可以指定字体、颜色和大小。在块级别可以指定更高一级的行为,例如文本流方向、对齐方式和背景色。

    文档结构并不是直接维护的,而是需要通过基于光标的接口进行编辑。文档光标接口会自动向根框架插入新的文档元素,并且确保这个元素在必要时有一个适合的空块。

    我们可以通过以下方式访问到根框架:

    1. QTextDocument *textDocument; 
    2. QTextFrame *root = textDocument->rootFrame(); 

    当需要进行文档结构导航时,有时候可以从根框架开始。因为根框架提供了访问整个文档结构的能力。

  • 相关阅读:
    面经 收藏的 这可能不只是一篇面经
    2017网易秋招编程集合
    网易2017春招笔试真题编程题集合题解
    小朋友 排序
    网易编程题目 02 赶去公司
    网易有道2017内推选择题
    12,享元模式(Flyweight Pattern)是以共享的方式高效的支持大量的细粒度的对象。
    11,外观模式(Facade Pattern)是为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
    新手进行Oracle MIS系统开发的步骤
    Oracle常用查看表结构命令(一)
  • 原文地址:https://www.cnblogs.com/dongxiao/p/2544369.html
Copyright © 2011-2022 走看看