• 【Qt开发流程】之富文本处理


    描述

    Scribe框架提供了一组类,用于读取和操作结构化的富文本文档。与Qt中以前的富文本支持不同,新的类集中在QTextDocument类上,而不是原始文本信息。这使开发者能够创建和修改结构化的富文本文档,而不必准备中间标记格式的内容。

    文档中的信息可以通过两个互补的接口访问:基于光标的接口用于编辑只读分层接口提供文档结构的高层次概述。基于光标的接口的主要优点是,可以使用模拟用户与编辑器交互的操作编辑文本,而不会丢失文档的基础结构。只读分层接口在执行搜索和文档导出等操作时最有用。

    Qt中,富文本处理可以使用QTextEditQTextBrowser实现。这两个类都继承自QAbstractScrollArea类,提供了文本的显示和编辑功能。

    QTextEdit提供了类似于一个文本编辑器的界面,可以进行编辑和显示富文本。需要注意的是,QTextEdit可以显示图片和嵌入式对象,但不能直接播放音频和视频。

    QTextBrowser提供了一个只读的文本显示界面,可以用于显示富文本内容。与QTextEdit不同,QTextBrowser只支持显示图片,不支持嵌入式对象。

    Qt中实现富文本处理的流程:

    1. 创建QTextEditQTextBrowser对象,设置其属性和初始文本内容;

    2. 使用QTextCursor操作文本内容,如插入文本、设置字体和颜色、插入图片等;

    3. 将富文本内容保存到文件或使用QClipboard复制到剪贴板中;

    4. 在需要的位置显示富文本内容,如在某个对话框中、在网页中等。

    示例代码实现在QTextEdit中插入一张图片和设置不同的字体和颜色:
    注意:在使用插入图片功能时,需要将图片资源添加到Qt项目中,并使用相应的路径引用。

        ui->textEdit->setPlainText("Hello World!");  //设置初始文本内容
        ui->textEdit->setTextInteractionFlags(Qt::TextSelectableByMouse | Qt::TextSelectableByKeyboard); //设置文本可选中属性为false
    
        QTextCursor cursor = ui->textEdit->textCursor(); //获取文本光标
        cursor.insertImage(":/images/image.png"); //插入图片
    
        QFont font("Arial", 16, QFont::Bold); //设置字体
        cursor.movePosition(QTextCursor::End); //将光标移动到文本结尾
        QTextCharFormat format;
        format.setFont(font);
        cursor.insertText("\nQt is great!", format); //插入文本并设置字体
    
        QColor color(Qt::red); //设置颜色
        cursor.movePosition(QTextCursor::Start); //将光标移动到文本开头
        cursor.movePosition(QTextCursor::Right, QTextCursor::KeepAnchor, 5); //选中第一个单词
    //    cursor.setCharFormat(QTextCharFormat()); //清除之前的格式
    //    cursor.setCharFormat(QTextCharFormat(), QTextCharFormat::ForegroundBrush); //设置前景色
        ui->textEdit->setTextCursor(cursor);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在这里插入图片描述

    富文本相关类

    Qt提供了大量的类来解析、渲染、操作和编辑富文本。

    模块描述解释
    QAbstractTextDocumentLayoutAbstract base class used to implement custom layouts for QTextDocuments用于为QTextDocuments实现自定义布局的抽象基类
    QFontSpecifies a font used for drawing text指定用于绘制文本的字体
    QSyntaxHighlighterAllows you to define syntax highlighting rules, and in addition you can use the class to query a document’s current formatting or user data允许定义语法高亮规则,并且还可以使用该类查询文档的当前格式或用户数据
    QTextCursorOffers an API to access and modify QTextDocuments提供访问和修改QTextDocuments的API
    QTextDocumentHolds formatted text维护格式化的文本
    QTextDocumentFragmentRepresents a piece of formatted text from a QTextDocument表示来自QTextDocument的格式化文本片段
    QTextDocumentWriterFormat-independent interface for writing a QTextDocument to files or other devices用于将QTextDocument写入文件或其他设备的格式无关接口
    QTextBlockFormatFormatting information for blocks of text in a QTextDocumentQTextDocument中文本块的格式信息
    QTextCharFormatFormatting information for characters in a QTextDocumentQTextDocument中字符的格式信息
    QTextFormatFormatting information for a QTextDocumentQTextDocument的格式信息
    QTextFrameFormatFormatting information for frames in a QTextDocumentQTextDocument中框架的格式信息
    QTextImageFormatFormatting information for images in a QTextDocumentQTextDocument中图像的格式信息
    QTextLengthEncapsulates the different types of length used in a QTextDocument封装在QTextDocument中使用的不同类型的长度
    QTextListFormatFormatting information for lists in a QTextDocumentQTextDocument中列表的格式信息
    QTextTableCellFormatFormatting information for table cells in a QTextDocumentQTextDocument中表单元格的格式信息
    QTextTableFormatFormatting information for tables in a QTextDocumentQTextDocument中表格的格式信息
    QTextInlineObjectRepresents an inline object in a QAbstractTextDocumentLayout and its implementations表示QAbstractTextDocumentLayout及其实现中的内联对象
    QTextLayoutUsed to lay out and render text用于布局和呈现文本
    QTextLineRepresents a line of text inside a QTextLayout表示QTextLayout内的一行文本
    QTextListDecorated list of items in a QTextDocumentQTextDocument中装饰了的列表项
    QTextBlockContainer for text fragments in a QTextDocumentQTextDocument中文本片段的容器
    QTextBlockGroupContainer for text blocks within a QTextDocumentQTextDocument中文本块的容器
    QTextBlockUserDataUsed to associate custom data with blocks of text用于将自定义数据与文本块关联
    QTextFragmentHolds a piece of text in a QTextDocument with a single QTextCharFormat在QTextDocument中保留具有单个QTextCharFormat的文本片段
    QTextFrameRepresents a frame in a QTextDocument表示QTextDocument中的框架
    QTextObjectBase class for different kinds of objects that can group parts of a QTextDocument together不同类型的对象的基类,这些对象可以将QTextDocument的部分组合在一起
    QTextFrame::iteratorIterator for reading the contents of a QTextFrame用于读取QTextFrame内容的迭代器
    QTextBlock::iteratorQTextBlock::iterator class provides an iterator for reading the contents of a QTextBlockQTextBlock::iterator类为读取QTextBlock内容提供迭代器
    QTextOptionDescription of general rich text properties通用富文本属性的描述
    QTextTableRepresents a table in a QTextDocument表示QTextDocument中的表格
    QTextTableCellRepresents the properties of a cell in a QTextTable表示QTextTable中单元格的属性
    QPlainTextDocumentLayoutImplements a plain text layout for QTextDocument为QTextDocument实现纯文本布局
    QPlainTextEditWidget that is used to edit and display plain text用于编辑和显示纯文本的小部件
    QTextBrowserRich text browser with hypertext navigation富文本浏览器,带有超文本导航
    QTextEditWidget that is used to edit and display both plain and rich text用于编辑和显示纯文本和富文本的小部件

    QTextEdit的cursor和document关系图

    在这里插入图片描述

    Documen框架图

    在这里插入图片描述

    QTextFrame

        QTextDocument* doc = ui->textEdit->document();
        QTextFrame* frame = doc->rootFrame();
        QTextFrameFormat format;
        format.setBorderBrush(Qt::red);
        format.setBorder(3);
        frame->setFrameFormat(format);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    运行程序,发现只可以在红色边框内编辑。
    在这里插入图片描述
    使用光标类对象,在根框架中添加一个子框架。

        QTextFrameFormat frameFormat;
        frameFormat.setBackground(Qt::lightGray);
        frameFormat.setMargin(10);
        frameFormat.setPadding(10);
        frameFormat.setBorder(2);
        frameFormat.setBorderStyle(QTextFrameFormat::BorderStyle_Dotted);
        QTextCursor cursor = ui->textEdit->textCursor();
        cursor.insertFrame(frameFormat);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    显示如下:
    在这里插入图片描述

    文本块

    绑定信号和槽,输出文本块,以下只可获取文本块,不可获取frame的内容。

    void MainWindow::on_action_frame_triggered()
    {
        QTextDocument* doc = ui->textEdit->document();
        QTextFrame* frame = doc->rootFrame();
        QTextFrame::iterator it = frame->begin();
        while (!it.atEnd()) {
            QTextFrame* childFrame = it.currentFrame();
            QTextBlock childBlock = it.currentBlock();
            if(childFrame)
            {
                qDebug() << "frame";
            }else if(childBlock.isValid()){
                qDebug() << "block :" << childBlock.text();
            }
    
            ++it;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    显示如下:
    在这里插入图片描述
    在这里插入图片描述
    获取frame的内容:

    void MainWindow::on_actionframeText_triggered()
    {
       QTextDocument* doc = ui->textEdit->document();
       QTextBlock block = doc->firstBlock();
       for (int var = 0; var < doc->blockCount(); ++var) {
           qDebug() << block.text();
    
           block = block.next();
       }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    界面及结果:
    在这里插入图片描述
    在这里插入图片描述

    QTextBlockFormat和QTextCharFormat

    QTextBlockFormat:设置对齐方式、缩进等格式;
    QTextCharFormat:设置字体、颜色、下划线等格式。

        QTextBlockFormat blockFormat;
        blockFormat.setAlignment(Qt::AlignCenter);
        cursor.insertBlock(blockFormat);
        QTextCharFormat charFormat;
        charFormat.setBackground(Qt::lightGray);
        charFormat.setForeground(Qt::blue);
        charFormat.setFont(QFont("宋体", 12, QFont::Bold, true));
        charFormat.setFontUnderline(true);
        cursor.setCharFormat(charFormat);
        cursor.insertText("helloworld");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    效果如下:
    在这里插入图片描述

    插入表格、列表、图片

    表格相关类:

    QTextTableFormatQTextTableCellFormat QTextTable

        QTextTable *insertTable(int rows, int cols, const QTextTableFormat &format);
        QTextTable *insertTable(int rows, int cols);
        QTextTable *currentTable() const;
    
    • 1
    • 2
    • 3

    示例:

        QTextTableFormat tableFormat;
        tableFormat.setCellSpacing(2);
        tableFormat.setCellPadding(10);
        cursor.insertTable(2, 2, tableFormat);
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    列表相关类:

    QTextListFormatQTextList

        QTextList *insertList(const QTextListFormat &format);
        QTextList *insertList(QTextListFormat::Style style);
    
        QTextList *createList(const QTextListFormat &format);
        QTextList *createList(QTextListFormat::Style style);
        QTextList *currentList() const;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    示例:

        QTextListFormat listFormat;
        listFormat.setStyle(QTextListFormat::ListDecimal);
        cursor.insertList(listFormat);
    
    • 1
    • 2
    • 3
    图片相关类:

    QTextImageFormat

        void insertImage(const QTextImageFormat &format, QTextFrameFormat::Position alignment);
        void insertImage(const QTextImageFormat &format);
        void insertImage(const QString &name);
        void insertImage(const QImage &image, const QString &name = QString());
    
    • 1
    • 2
    • 3
    • 4

    查找

    查找到后,可以定位字符串所在的行和列的编号。

    qDebug() << ui->textEdit->find("hello world", QTextDocument::FindBackward);
    
    ui->textEdit->textCursor().blockNumber();
    ui->textEdit->textCursor().columnNumber();
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    Python类和对象(在学过其他语言类和对象的基础上)
    如何在 Vim 中剪切、复制和粘贴
    Vue后台管理系统框架推荐
    牛客网Python专项练习重点题整理
    【毕业设计】深度学习疲劳检测 驾驶行为检测 - python opencv cnn
    LeetCode 221. 最大正方形(C++)*
    C++回溯法leetcode练习集
    STM32物联网项目-低功耗模式
    SparkSQL系列-6、外部数据源 DataSource?
    水库大坝可视化智能远程监管方案,助力安全监测智能巡检
  • 原文地址:https://blog.csdn.net/MrHHHHHH/article/details/134520170