Qt 富文本处理(12):列表和列表格式

前言

  富文本文档的列表类 :QTextList 类是QTextBlockGroup 的子类。由QTextListFormat提供装饰。层次结构如下:

1

QTextBlockGroup 类

 QTextBlockGroup类为QTextDocument中的文本块提供了一个容器。

  文本块组可用于组织文档中的文本块。它们维护属于它们的文本块的最新列表,即使在编辑文本块时也是如此。每个组都有父文档,父文档在组构造时指定。

  可以使用blockInserted()将文本块插入到组中
  使用blockremove()删除文本块。
  如果块的格式被更改,则调用blockFormatChanged()。
  组中的块列表由blockList()返回。

  请注意,列表中的块不一定是文档中相邻的元素;例如,多级列表中的顶级项将由该列表较低级别的项分隔。

  QTextBlockGroup 类很简单,就是一个group的普通容器。

QTextList 类

  QTextList类提供了一个有修饰的QTextDocument项列表。

  列表包含一系列文本块,每个文本块都用项目符号或其他符号标记。可以使用多个级别的列表,并且自动编号特性提供了对有序数字和字母顺序列表的支持。

  通过使用文本光标在当前位置插入空列表或将现有文本移动到新列表中来创建列表。QTextCursor::insertList() 函数的作用是:在文档的游标位置插入一个空块,并使其成为列表中的第一项。

     QTextListFormat listFormat;
     if (list) {
         listFormat = list->format();
         listFormat.setIndent(listFormat.indent() + 1);
     }

     listFormat.setStyle(QTextListFormat::ListDisc);
     cursor.insertList(listFormat);

  QTextCursor :: createList()函数获取光标当前块的内容,并将其转换为新列表的第一项。
  游标的当前列表可通过QTextCursor :: currentList()找到。
  列表中的项目数由count()给出。
  使用item()函数通过列表中的索引获取每个项目。
  使用itemNumber()找到给定项目的索引。
  使用itemText()函数找到每个项目的文本。
  请注意,列表中的项目可能不是文档中的相邻元素。 例如,多级列表中的顶级项目将由列表中较低级的项目分隔。
  使用removeItem()函数通过索引删除列表项。 remove()删除列表中的指定项目。
  列表的格式使用setFormat()设置,并使用format()读取。 该格式描述列表本身的修饰,而不是单个项目的修饰。

QTextListFormat类

  QTextListFormat类为QTextDocument中列表提供格式信息。

  列表由一个或多个项目组成,表示为文本块。 列表的格式指定列表中项目的外观。 特别是,它确定每个项目缩进样式

  项的缩进是一个整数值,该值使每个项从左边缘偏移一定量。 使用indent()读取此值,并使用setIndent()进行设置。

  用于装饰每个项目的样式是通过setStyle()设置的,并且可以通过style()函数读取。 样式控制用于列表中项目的项目符号点的类型和编号方案。 请注意,使用十进制编号方案的列表从1而不是0开始计数。

  可以设置样式属性以进一步配置列表项的外观。 例如,ListNumberPrefix和ListNumberSuffix属性可用于自定义有序列表中使用的数字,以便它们显示为(1),(2),(3)等:

 QTextListFormat listFormat;

 listFormat.setStyle(QTextListFormat::ListDecimal);
 listFormat.setNumberPrefix("(");
 listFormat.setNumberSuffix(")");

 cursor.insertList(listFormat);

代码示例

主要代码如下:

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);      //设置文本文档的默认字体
    QFontMetrics fm(doc->defaultFont());
    doc->setIndentWidth(fm.horizontalAdvance(QChar('W')) );

    //通过文本编辑器获取当前文本光标
    QTextCursor cursor = edit->textCursor();
    cursor.insertText("1234567890");

    QTextListFormat listFormat;

    listFormat.setStyle(QTextListFormat::ListDecimal);
    listFormat.setNumberPrefix("(");
    listFormat.setNumberSuffix(")");
    listFormat.setIndent(4);    // 也是一个和文档默认缩进的乘积

    QTextList * list = cursor.insertList(listFormat);
    for (int i = 0; i < 5; ++i) {
        if(i < 4)
            cursor.insertText("hello\n");
        else
            cursor.insertText("hello");
    }


    listFormat.setStyle(QTextListFormat::ListLowerRoman);
    listFormat.setIndent(listFormat.indent() + 2);

    cursor = QTextCursor(list->item(3-1));
    cursor.movePosition(QTextCursor::EndOfBlock,QTextCursor::MoveAnchor);
    cursor.insertList(listFormat);
    for (int i = 0; i < 4; ++i) {
        if(i < 3)
            cursor.insertText("world\n");
        else
            cursor.insertText("world");
    }
}

总结

  富文本列表的内容也比较少,列表的缩进只针对文本块,没有理会列表的前缀、后缀占用的空间。

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页