Проблемы с производительностью при отображении больших текстовых файлов с использованием TextArea и ScrollView - PullRequest
0 голосов
/ 21 февраля 2020

Вариант использования: я хотел бы показать большие файлы журнала (8k + строк), используя QML или хотя бы QML-совместимые компоненты. Такие функции, как многострочный выбор, копирование и подсветка синтаксиса, являются обязательными.

Проблема: Подход по умолчанию будет использовать TextArea внутри ScrollView, но проблема заключается в большом использовании памяти (на моем компьютере с несколькими выбранными строками : 2GB +) вызывает зависания (5 секунд +) и вылетает.

Пример кода:

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, но предоставляя собственную функцию прокрутки, которая загружает текст по требованию, предотвращая визуализацию всего текста сразу. Проблема в том, что мне придется написать свой собственный выбор и скопировать функции поверх существующих.

1 Ответ

1 голос
/ 21 февраля 2020

Этот комментарий от Jira подводит итог проблемы и предоставляет возможное решение:

TextEdit Qt Quick будет фактически заполнять граф сцены узлами для всех глифов, а не только для видимые Существует логика c для максимально возможной изоляции обновлений, но вся геометрия для всего текста должна быть обработана как минимум один раз и загружена в графический процессор, и для нее будут сгенерированы вызовы отрисовки.

Так Суть в том, что TextEdit на данный момент не подходит для текстов такого размера. Пока это не будет решено, я бы рекомендовал вместо этого использовать QQuickPaintedItem и QTextDocument.

...