Qt 富文本处理(10):文本片段和文本字符格式

前言

  文本片段用于单一字符格式字符的存储。字符格式为字符提供不同的样式。

  富文本文档的文档元素:QTextFragment类和QTextCharFormat 类的层次结构如下图所示:

1

QTextCharFormat类

  QTextCharFormat类提供了QTextDocument中字符的格式化信息。

  主要就是为了设置字符的字体、大小、前景、背景、下划线、超链接等比较常见的功能。相同的字符格式组成同一个文本片段。文档中文本的字符格式指定文本的可视属性,以及关于其在超文本文档中的角色的信息。

  可以通过向setFont()函数提供字体来设置所使用的字体,并且可以调整其外观的各个方面以获得所需的效果。setFontFamily()和setFontPointSize()定义字体的(例如时间)和打印大小;setFontWeight()和setFontItalic()提供对字体样式的控制。

  setFontUnderline()、setFontOverline()、setFontStrikeOut()和setFontFixedPitch()为文本提供额外的效果。
  颜色是用setForeground()设置的,背景用setBackground()设置

  如果文本打算用作(用于超链接),可以使用setAnchor()来启用它。setAnchorHref()和setAnchorNames()函数用于指定有关超链接的目的地和锚的名称的信息。

QTextFragment类

  QTextFragment类使用一个QTextCharFormat在QTextDocument中保存一段文本。

  文本片段描述用单一字符格式存储的一段文本。字符格式更改后可以由具有不同格式的文本片段序列表示的文本。

  如果用户在片段中编辑文本并引入不同的字符格式,那么片段的文本将在格式改变的每个点上被分割,并且新的片段将被创建。例如,在句子中间改变某些文本的风格会导致片段被分成三个独立的片段:第一个和第三个片段采用与之前相同的格式,第二个采用新的风格。第一个片段将包含从句子开头开始的文本,第二个片段将包含从中间开始的文本,第三个片段将从句子结尾开始的文本。

  文本片段的文本字符格式可以通过text()和charFormat()函数获得。

  length()函数的作用是:给出片段中文本的长度

  position()给出了片段在文档中开始的位置。

  要确定片段是否包含文档中的特定位置,可以使用contains()函数。

代码示例

主要代码如下:

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    edit = new QTextEdit;
    QVBoxLayout *mainLayout = new QVBoxLayout(this);
    mainLayout->addWidget(edit);
    resize(600,400);

    QTextDocument *doc = edit->document();  //获取文本文档
    QFont font("楷体",12);
    doc->setDefaultFont(font);      //设置文本文档的默认字体

    //通过文本编辑器获取当前文本光标
    QTextCursor cursor = edit->textCursor();
    //定义文本字符格式 charFormat变量
    QTextCharFormat charFormat;
    //设置charFormat的字体
    charFormat.setFont(QFont("宋体",12));
    //设置charFormat的字体颜色,即前景色- 暗青
    charFormat.setForeground(Qt::darkCyan);
    //当前文本光标设置字符格式
    cursor.setCharFormat(charFormat);
    cursor.insertText("The character format of text in a document specifies the visual properties of the text, as well as information about its role in a hypertext document.");
    //换一种字体颜色 红色
    charFormat.setForeground(Qt::red);
    cursor.setCharFormat(charFormat);
    cursor.insertText("The QTextBlock class provides a container for text fragments in a QTextDocument.");

    //字符格式的超链接的使用
    charFormat.setAnchor(true); //启用锚功能
    charFormat.setAnchorHref("http://www.baidu.com"); //超链接地址
    charFormat.setBackground(Qt::blue);  //字体背景

    charFormat.setFontUnderline(true);  //设置下划线
    cursor.setCharFormat(charFormat);
    cursor.insertText("hello,百度");

//    qDebug() << cursor.charFormat().isAnchor();
//    if(cursor.charFormat().isAnchor())
//        QDesktopServices::openUrl(cursor.charFormat().anchorHref()); //通过桌面服务打开超链接

    //文本片段的迭代,通过所在的容器的迭代器
    QTextBlock::iterator it;
    for (it = cursor.block().begin(); !(it.atEnd()); ++it) {
        QTextFragment currentFragment = it.fragment();
        if (currentFragment.isValid()) {
            if(currentFragment.charFormat().isAnchor())
                qDebug() <<currentFragment.text() << currentFragment.charFormat().anchorHref();
            else
                qDebug() <<currentFragment.text() ;
        }
    }
}

总结

  文本片段和文本字符格式是配合使用的,但是文本片段的创建是由不同的文本字符格式自动创建的,没有人工的参与。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值