Qt中富文本处理

做~自己de王妃 提交于 2019-12-04 09:57:36

富文本处理

 富文本(Rich Text)或者叫做富文本格式,简单来说就是在文档中可以使用多种格式,比如字体颜色、图片和表格等等。它是与纯文本(Plain Text)相对而言的,比如Windows上的记事本就是纯文本编辑器,而Word就是富文本编辑器。

  • 富文本文档结构
  • 文本块
  • 表格、列表与图片
  • 查找功能
  • 语法高亮与HTML

1 富文本文档结构

在Qt中提供了对富文本处理的支持。Qt中对富文本的处理分为了编辑操作和只读操作两种方式。

  • 编辑操作是使用基于光标的一些接口函数,这样更好的模拟了用户的编辑操作,更加容易理解,而且不会丢失底层的文档框架。
  • 而对于文档结构的概览,使用了只读的分层次的接口函数,它们有利于文档的检索和输出。

对于文档的读取和编辑要使用不同方面的两组接口。

  • 文档的光标主要基于QTextCursor类
  • 文档的框架主要基于QTextDocument类

一个富文本文档的结构被分为了几种元素来表示:

  • 框架(QTextFrame)
  • 文本块(QTextBlock)
  • 表格(QTextTable)
  • 列表(QTextList)

 每种元素的格式又使用相应的format类来表示:

  • 框架格式(QTextFrameFormat)
  • 文本块格式(QTextBlockFormat)
  • 表格格式(QTextTableFormat)
  • 列表格式(QTextListFormat)

这些格式一般在编辑文档时使用,所以它们常和QTextCursor类配合使用。

因为QTextEdit类就是一个富文本编辑器,所以在构建QTextEdit类的对象时就已经构建了一个QTextDocument类对象和一个QTextCursor类对象,只需调用它们进行相应的操作即可。

一个空的文档包含了一个根框架(Root frame),这个根框架又包含了一个空的文本块(Block)。框架将一个文档分为多个部分,在根框架里可以再添加文本块、子框架和表格等。 

  

设置根框架

  1.  
    QTextDocument *document = ui->textEdit->document(); //获取文档对象
  2.  
     
  3.  
    QTextFrame *rootFrame = document->rootFrame(); // 获取根框架
  4.  
     
  5.  
    QTextFrameFormat format; // 创建框架格式
  6.  
     
  7.  
    format.setBorderBrush(Qt::red); // 边界颜色
  8.  
     
  9.  
    format.setBorder(3); // 边界宽度
  10.  
     
  11.  
    rootFrame->setFrameFormat(format); // 框架使用格式

添加子框架

  1.  
    QTextFrameFormat frameFormat;
  2.  
     
  3.  
    frameFormat.setBackground(Qt::lightGray); // 设置背景颜色
  4.  
     
  5.  
    frameFormat.setMargin(10); // 设置边距
  6.  
     
  7.  
    frameFormat.setPadding(5); // 设置填衬
  8.  
     
  9.  
    frameFormat.setBorder(2);
  10.  
     
  11.  
    //设置边框样式
  12.  
    frameFormat.setBorderStyle(QTextFrameFormat::BorderStyle_Dotted);
  13.  
     
  14.  
    QTextCursor cursor = ui->textEdit->textCursor(); // 获取光标
  15.  
     
  16.  
    cursor.insertFrame(frameFormat); // 在光标处插入框架

2 文本块

文本块QTextBlock类为文本文档QTextDocument提供了一个文本片段(QTextFragment)的容器。

 一个文本块可以看做是一个段落,但是它不能使用回车换行,因为一个回车换行就表示创建一个新的文本块。QTextBlock提供了只读接口,它是前面提到的文档分层次的接口的一部分,如果QTextFrame看做是一层,那么其中的QTextBlock就是另一层。

文本块的格式由QTextBlockFormat类来处理,它主要涉及对齐方式,文本块四周的边白,缩进等内容。而文本块中的文本内容的格式,比如字体大小、加粗、下划线等内容,则由QTextCharFormat类来设置。

遍历框架

  1.  
    QTextDocument *document = ui->textEdit->document();
  2.  
    QTextFrame *frame = document->rootFrame();
  3.  
    QTextFrame::iterator it; // 建立QTextFrame类的迭代器
  4.  
    for (it = frame->begin(); !(it.atEnd()); ++it) {
  5.  
    QTextFrame *childFrame = it.currentFrame();// 获取当前框架的指针
  6.  
    QTextBlock childBlock = it.currentBlock(); // 获取当前文本块
  7.  
    if (childFrame)
  8.  
    qDebug() << "frame";
  9.  
    else if (childBlock.isValid())
  10.  
    qDebug() << "block:" << childBlock.text();
  11.  
    }

遍历子框架

  1.  
    QTextDocument *document = ui->textEdit->document();
  2.  
    QTextBlock block = document->firstBlock(); // 获取文档的第一个文本块
  3.  
    for (int i = 0; i < document->blockCount(); i++) {
  4.  
    qDebug() << tr("文本块%1,文本块首行行号为:%2,长度为:%3,内容为:")
  5.  
    .arg(i).arg(block.firstLineNumber()).arg(block.length())
  6.  
    << block.text();
  7.  
    block = block.next(); // 获取下一个文本块
  8.  
    }

 

  1.  
    QTextCursor cursor = ui->textEdit->textCursor();
  2.  
    QTextBlockFormat blockFormat; // 文本块格式
  3.  
    blockFormat.setAlignment(Qt::AlignCenter); // 水平居中
  4.  
    cursor.insertBlock(blockFormat); // 使用文本块格式
  5.  
    QTextCharFormat charFormat;// 字符格式
  6.  
    charFormat.setBackground(Qt::lightGray); // 背景色
  7.  
    charFormat.setForeground(Qt::blue);// 字体颜色
  8.  
    // 使用宋体,12号,加粗,倾斜
  9.  
    charFormat.setFont(QFont(tr("宋体"), 12, QFont::Bold, true));
  10.  
    charFormat.setFontUnderline(true); // 使用下划线
  11.  
    cursor.setCharFormat(charFormat); // 使用字符格式
  12.  
    cursor.insertText(tr("测试字体")); // 插入文本

3 表格、列表和图片

  1.  
    //插入表格
  2.  
    QTextCursor cursor = ui->textEdit->textCursor();
  3.  
    QTextTableFormat format; // 表格格式
  4.  
    format.setCellSpacing(2); // 表格外边白
  5.  
    format.setCellPadding(10); // 表格内边白
  6.  
    cursor.insertTable(2, 2, format); // 插入2行2列表格
  7.  
    //插入列表
  8.  
    QTextListFormat format; // 列表格式
  9.  
    format.setStyle(QTextListFormat::ListDecimal); // 数字编号
  10.  
    ui->textEdit->textCursor().insertList(format);
  11.  
    //插入图片
  12.  
    QTextImageFormat format; // 图片格式
  13.  
    format.setName("logo.png"); // 图片路径
  14.  
    ui->textEdit->textCursor().insertImage(format);

4 查找功能

  1.  
    //查找文本
  2.  
    QDialog *dlg = new QDialog(this); // 创建对话框
  3.  
    lineEdit = new QLineEdit(dlg); // 创建行编辑器
  4.  
    QPushButton *btn = new QPushButton(dlg); // 创建按钮
  5.  
    btn->setText(tr("查找下一个"));
  6.  
    connect(btn,SIGNAL(clicked()),this,SLOT(findNext())); // 关联信号和槽
  7.  
    QVBoxLayout *layout = new QVBoxLayout; // 创建垂直布局管理器
  8.  
    layout->addWidget(lineEdit); // 添加部件
  9.  
    layout->addWidget(btn);
  10.  
    dlg->setLayout(layout); // 在对话框中使用布局管理器
  11.  
    dlg->show();
  12.  
     
  13.  
    //查找下一个
  14.  
    QString string = lineEdit->text();
  15.  
    // 使用查找函数查找指定字符串,查找方式为向后查找
  16.  
    bool isfind = ui->textEdit->find(string, QTextDocument::FindBackward);
  17.  
    if(isfind){ // 如果查找成功,输出字符串所在行和列的编号
  18.  
    qDebug() << tr("行号:%1 列号:%2")
  19.  
    .arg(ui->textEdit->textCursor().blockNumber())
  20.  
    .arg(ui->textEdit->textCursor().columnNumber());
  21.  
    }

5 语法高亮

在使用Qt Creator编辑代码时可以发现,输入关键字时会显示不同的颜色,这就是所谓的语法高亮。

在Qt的富文本处理中提供了QSyntaxHighlighter类来实现语法高亮。为了实现这个功能,需要创建QSyntaxHighlighter类的子类,然后重新实现highlightBlock()函数,使用时直接将QTextDocument类对象指针作为其父部件指针,这样就可以自动调用highlightBlock()函数了。

例如,自定义的类为MySyntaxHighlighter,像这样来使用:      highlighter = new MySyntaxHighlighter(ui->textEdit->document());      这里创建了MySyntaxHighlighter类的对象,并且使用编辑器的文档对象指针作为其参数,这样,每当编辑器中的文本改变时都会调用highlightBlock()函数来设置语法高亮。

重新实现highlightBlock()函数:

  1.  
    QTextCharFormat myFormat; // 字符格式
  2.  
    myFormat.setFontWeight(QFont::Bold);
  3.  
    myFormat.setForeground(Qt::green);
  4.  
    QString pattern = "\\bchar\\b"; // 要匹配的字符,这里是“char”单词
  5.  
    QRegExp expression(pattern); // 创建正则表达式
  6.  
    int index = text.indexOf(expression); // 从位置0开始匹配字符串
  7.  
    // 如果匹配成功,那么返回值为字符串的起始位置,它大于或等于0
  8.  
    while (index >= 0) {
  9.  
    int length = expression.matchedLength(); // 要匹配字符串的长度
  10.  
    setFormat(index, length, myFormat); // 对要匹配的字符串设置格式
  11.  
    index = text.indexOf(expression, index + length); // 继续匹配
  12.  
    }

在这里主要是使用了正则表达式和QString类的indexOf()函数来进行字符串的匹配,如果匹配成功,则使用QSyntaxHighlighter类的setFormat()函数来设置字符格式。

6 HTML

在富文本处理中还提供了对HTML子集的支持,可以在QLabel或者QTextEdit添加文本时使用HTML标签或者CSS属性,例如:

ui->textEdit->append(tr("<h1><font color=red>使用HTML</font></h1>"));  
 

这里往编辑器中添加了文本,并且使用了HTML标签,

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!