在 QML TextArea 中设置来自 QRC 的文本

问题描述 投票:0回答:1

我有一个带有

TextArea
的 Qt Quick QML 文件,我希望它显示来自 QRC 资源的文本。其他带有图像的控件有一个
source
成员,可以设置为直接从 QRC QURL 加载(请参阅here),但 TextArea 必须直接设置文本。 Qt 5.x 中从 QRC 资源设置文本值的最简洁方法是什么?我想要

        TextArea
        {
            text: LoadResource("qrc://messages.txt")
        }

另一个问题here提到了一个简单的过程,但是代码已经消失了,现在只展示了如何在C++中使用do it。

qt qml qtquick2 qtquickcontrols2
1个回答
2
投票

您可以使用

XMLHttpRequest
访问本地文件和嵌入资源,但需要将
QML_XHR_ALLOW_FILE_READ
环境变量设置为1,例如

    // in main.cpp
    qputenv("QML_XHR_ALLOW_FILE_READ", QString("1").toUtf8());
    // in qml
        let xhr = new XMLHttpRequest();
        xhr.open("GET", "messages.txt"); 
        xhr.onreadystatechange = () => {
            if (xhr.readyState !== 4) return;
            if (xhr.status !== 0 && (xhr.status < 200 || xhr.status >= 400)) return;
            // handle xhr.responseText;
        }
        xhr.send();

在下面的示例中,我将

XMLHttpRequest
重构为
TextLoader
组件:

import QtQuick
import QtQuick.Controls
Page {
    Frame { 
        width: parent.width
        TextArea {
            width: parent.width
            wrapMode: Text.WrapAtWordBoundaryOrAnywhere
            TextLoader {
                url: "messages.txt"
            }
        }
    }
}

// TextLoader.qml
import QtQuick
Item {
    id: textLoader
    property var target: parent
    property string property: "text"
    property string url
    onUrlChanged: Qt.callLater(load)
    function load() {
        if (!url) return;
        let xhr = new XMLHttpRequest();
        xhr.open("GET", url); 
        xhr.onreadystatechange = () => {
            if (xhr.readyState !== 4) return;
            if (xhr.status !== 0 && (xhr.status < 200 || xhr.status >= 400)) return;
            target[property] = xhr.responseText;
        }
        xhr.send();
    }
    Component.onCompleted: Qt.callLater(load)
}

// messages.txt
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris scelerisque augue non magna consectetur pretium quis lobortis mi. Sed fermentum, turpis at molestie imperdiet, odio magna elementum libero, quis posuere lorem risus in libero. Nunc ullamcorper massa eget condimentum venenatis. Donec eget tempus leo, id gravida sem. Duis eget libero id lorem fringilla accumsan dictum sed purus. Pellentesque tristique velit at quam pharetra, in porta tortor hendrerit. In tristique imperdiet velit, ac hendrerit metus sagittis a. Fusce suscipit tellus volutpat, accumsan metus non, tempus sem.

您可以在线尝试!

© www.soinside.com 2019 - 2024. All rights reserved.