首页 > 解决方案 > 在 qml 中显示大文本

问题描述

试图在 qml 中显示一个文本文件。文件大小约为 3 兆字节。同时还有:

尝试使用 ScrollView、Flickable、Text 和 TextArea。如何避免这些问题?

QML

ScrollView {
    id: idScrollView
    anchors {
        fill: parent
        margins: Dimensions.x(15)
    }
    Text {
        id: idContent
        anchors {
            left: parent.left
            right: parent.right
            rightMargin: Dimensions.x(20)
        }
        text: viewmodel.getLogText()
        font.pixelSize: Dimensions.y(10)
        wrapMode: Text.Wrap
    }
}

C++

QString MainViewModel::getLogText()
{
    const int maxSz = 1024 * 200;
    QString result;
    QFile file(ALog::filePath());
    if (file.open(QIODevice::ReadOnly))
    {
        if (file.size() > maxSz)
            file.seek(file.size() - maxSz);
        QByteArray arr = file.read(maxSz);
        result = QString::fromLatin1(arr);
        if (file.size() > maxSz)
            result = QString("Skip %1  Kb\n\n").arg((file.size() - maxSz)/1024) + result;
        file.close();
    }

    return result;
}

标签: qtqml

解决方案


找到了部分解决方案。它加载速度更快,消耗的内存少了几倍。缺点之一是无法将 Text 转换为 TextArea 以便能够选择要复制到剪贴板的文本。

property variant stringList: null

function updateText() {
    stringList = viewmodel.getLogText().split('\n')
    idContentListView.positionViewAtEnd()
}

ListView {
    id: idContentListView
    model: stringList
    anchors {
        fill: parent
        margins: Dimensions.x(15)
    }
    delegate: Text {
        anchors {
            left: parent.left
            right: parent.right
        }
        text: model.modelData
        font.pixelSize: Dimensions.y(10)
        textFormat: Text.PlainText
        wrapMode: Text.Wrap
    }
    ScrollBar.vertical: ScrollBar {}
}

推荐阅读