用例:我想显示使用QML或至少与QML兼容的组件的大型日志文件(8k +行)。多行选择,复制和语法突出显示等功能是必需的。
问题:默认方法是在ScrollView中使用TextArea,但问题是内存使用率高(在我的计算机上选择了多行:2GB +)导致冻结(5sec +)并崩溃。
示例代码:
import QtQuick 2.12
import QtQuick.Controls 2.5
ApplicationWindow {
visible: true
width: 640
height: 480
title: qsTr("TextEditTest")
ScrollView {
id: scrollView
anchors.fill: parent
TextArea {
id: textArea
text: " "
renderType: Text.NativeRendering
textFormat: Text.PlainText
placeholderText: "no text found"
readOnly: true
selectByMouse: true
}
}
}
((只需在“”中插入一些文本(8k +行)
问题:是否可以提高TextArea + ScrollView的内存使用率?还是有其他选择?
可能的解决方案?:仍使用TextEdit,但提供了自己的滚动功能,该功能可以按需加载文本,从而防止一次渲染整个文本。问题是我必须在现有功能的基础上编写自己的选择和复制功能。
This comment from Jira总结问题并提供可能的解决方案:
Qt Quick的TextEdit实际上将在场景图中填充所有字形的节点,而不仅仅是可见字形的节点。有逻辑来尽可能地隔离更新,但是所有文本的所有几何都必须至少处理一次并上载到GPU,并为此生成绘图调用。
所以最重要的是,TextEdit目前不适合这种大小的文本。在解决此问题之前,我建议您改用QQuickPaintedItem和QTextDocument。