背景与需求:为使 Qt Quick 和 Qt Quick Controls 能在更多应用中替代 Widgets,需改进文本编辑用例,因其在许多应用中需求大且常被重写。
- 访问文档对象:[TextEdit]或[TextArea]用[QTextDocument]作“模型”,Qt 5 早期添加[textDocument]属性以将内部创建的实例暴露给 C++代码,用户不仅要访问还能替换,为此去掉旧的私有子类并实现[QQuickTextEdit::loadResource()],[QQuickTextDocument::setTextDocument()]在 Qt 6.7 中新增,若替换文档对象需负责远程资源加载。
- 加载与保存:[TextEdit.textDocument]已存在,可在此添加面向 QML 的新 API,QML 加载媒体文件模式是有个 source 属性,已给[QQuickTextDocument]添加[source-prop]属性,QML 几乎无写文件 API,现添加[TextDocument.save()]和[saveAs()]函数,新 API 有技术预览状态,存在如提取加载文本数据等问题,6.8 中添加[QTextDocument::metaInformation]。还可进行文件转换,现有[textFormat]属性可转换格式及切换所见即所得和原始标记。
- 文本格式化 API:C++中常用[QTextCursor]定义要修改的文本范围并应用样式,QML 中类似的是[TextSelection],[TextEdit.cursorSelection]对应用户选择的文本,可绑定到控件显示和更改块及字符格式属性,可参考[Text Editor]示例。
- 大文档:在 Qt 最近几个版本中,[Text]和[TextEdit]避免为超出视口的大量文本生成场景图节点,基于一般机制,父项设置[ItemIsViewport]标志,子项设置[ItemObservesViewport]标志,子项的[clipRect]提供视口可见区域,TextEdit 仅为与[clipRect]重叠的文本块生成场景图节点,在滚动时[updatePaintNode]调用更频繁。
- 展望:现在可在纯 QML 中编写所见即所得的富文本编辑器,示例不再需要 C++,只需基本的 main()函数。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。