欢迎光临
我们一直在努力

Qt6 QML Markdown 渲染:TextEdit 原生实现、工程 Demo

Qt6 QML Markdown 渲染:TextEdit 原生实现、工程 Demo

flyfish

看 https://github.com/shaoshengsong/QwenBox 这里 怎么把模型返回的 Markdown 内容显示出来。

有两个常见解法:

Electron(基于 Chromium 浏览器内核)相当于把一个精简版的 Chrome 浏览器打包进了.exe安装包,整个聊天窗口、侧边栏、设置页、工作台全都是用 React + HTML/CSS/JS 写的网页

这里用的是Qt 的 TextEdit.MarkdownText 原生。

Qt Quick 的 TextEdit 控件 + 属性 textFormat: TextEdit.MarkdownText。

就这一行设置,Qt 会把 Markdown(CommonMark 子集)文本自动渲染成富文本。 不需要引入任何第三方 Markdown 解析库(。

TextEdit {
text: model.content // 模型返回的 Markdown 原文
textFormat: TextEdit.MarkdownText
readOnly: true
selectByMouse: true // 允许鼠标拖选、Ctrl+C 复制
}

演示工程 markdown-demo/qml/main.qml 中,右侧「渲染结果」面板是同一行代码; 左侧是可编辑的源码,二者用 text: src.text 绑定,做到实时预览。

补充说明:如果只是展示、不需要选中复制,也可以用 Text 控件并设 textFormat: Text.MarkdownText。聊天场景因为要选中/复制,所以用 TextEdit。 两者底层渲染引擎相同。

2. 底层原理

TextEdit.MarkdownText 走的是 Qt 内置的 CommonMark 子集 实现。 Qt 在内部把 CommonMark 文本转换成 QTextDocument 富文本 表示,再由 Qt Quick 的场景图(Scene Graph)绘制。 渲染完全在主线程 / UI 线程完成,模型侧只负责把 Markdown 字符串通过 C++ 模型(MessageModel)传给 QML,不参与解析。

Markdown 文本
│ Qt 内置 CommonMark 子集解析器

QTextDocument(富文本对象模型)
│ Qt Quick 场景图(Scene Graph)

屏幕上的富文本

3. 演示工程使用方法

目录:markdown-demo/

markdown-demo/
├── markdown-demo.pro # Qt6 工程文件(QT += qml quick quickcontrols2,c++17)
├── main.cpp # 启动器,从资源读取 sample.md 注入 QML
├── qml.qrc # 资源:main.qml + sample.md
├── qml/
│ └── main.qml # 左编辑 / 右实时渲染 的演示界面
├── sample.md # 一份覆盖常用语法的 Markdown 样例

下载地址

直接用 Qt Creator 打开 markdown-demo.pro,选 Qt 6.9.x MSVC2022 64-bit kit 即可构建运行。 构建完成后 bin/ 目录已是自包含发布包,双击 markdown-demo.exe 即可打开。

在这里插入图片描述

赞(0)
未经允许不得转载:171主机测评 » Qt6 QML Markdown 渲染:TextEdit 原生实现、工程 Demo
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址