You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt Quick应用中C++读取JSON数据后在UI文本框展示的实现方法咨询

解决Qt Quick中展示C++读取的JSON数据问题

嘿,我来帮你搞定把C里读到的JSON数据显示到Qt Quick UI上的问题!核心思路是**让C类的属性能被QML访问**,然后把读取到的JSON文本存到这个属性里,再触发更新通知,QML那边绑定这个属性就能自动刷新显示了。

步骤1:给Jsonfile类添加可被QML访问的属性

首先,你的Jsonfile类得是QObject的子类(应该已经是了,不然没法用Qt的元对象系统),然后添加一个Q_PROPERTY来存储要展示的JSON文本:

// Jsonfile.h
#include <QObject>
#include <QString>

class Jsonfile : public QObject
{
    Q_OBJECT
    // 定义可被QML访问的属性,用于存储要展示的JSON文本
    Q_PROPERTY(QString jsonDisplayText READ jsonDisplayText WRITE setJsonDisplayText NOTIFY jsonDisplayTextChanged)

public:
    explicit Jsonfile(QObject *parent = nullptr);

    void display();

    // 属性的READ方法
    QString jsonDisplayText() const;
    // 属性的WRITE方法
    void setJsonDisplayText(const QString &newJsonDisplayText);

signals:
    // 属性变化时发射的信号,通知QML更新
    void jsonDisplayTextChanged();

private:
    // 存储JSON文本的成员变量
    QString m_jsonDisplayText;
};

步骤2:修改display函数,把数据存到属性里

原来的display函数是把JSON输出到控制台,现在要改成把JSON文本赋值给我们刚才定义的m_jsonDisplayText,并发射信号:

// Jsonfile.cpp
#include "Jsonfile.h"
#include <QFile>
#include <QJsonDocument>
#include <QJsonParseError>
#include <QDebug>

Jsonfile::Jsonfile(QObject *parent) : QObject(parent) {}

QString Jsonfile::jsonDisplayText() const
{
    return m_jsonDisplayText;
}

void Jsonfile::setJsonDisplayText(const QString &newJsonDisplayText))
{
    if (m_jsonDisplayText == newJsonDisplayText)
        return;
    m_jsonDisplayText = newJsonDisplayText;
    emit jsonDisplayTextChanged();
}

void Jsonfile::display(){
    QFile file("data.json");
    if(!file.open(QIODevice::ReadOnly)){
        qDebug() << "file couldn't be opened/found";
        // 可以设置提示文本显示到UI
        setJsonDisplayText("无法打开data.json文件");
        return;
    }
    QByteArray byteArray = file.readAll();
    file.close();

    QJsonParseError parseError;
    QJsonDocument jsonDoc = QJsonDocument::fromJson(byteArray, &parseError);
    if(parseError.error != QJsonParseError::NoError){
        qWarning() << "Parse error at " << parseError.offset << ":" << parseError.errorString();
        // 把解析错误显示到UI
        setJsonDisplayText(QString("JSON解析错误:%1").arg(parseError.errorString()));
        return;
    }

    // 把格式化后的JSON文本存到属性里,触发信号通知QML更新
    QString jsonText = QString::fromUtf8(jsonDoc.toJson(QJsonDocument::Indented));
    setJsonDisplayText(jsonText);
}

步骤3:在QML中绑定属性展示数据

接下来需要确保你的Jsonfile实例能被QML访问到,这里用最常用的全局对象方式:在C++中创建实例,把它设置为QML的全局上下文属性。

在main.cpp里:

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "Jsonfile.h"

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    // 创建Jsonfile实例,设置为QML全局对象,名字叫jsonHandler
    Jsonfile jsonHandler;
    engine.rootContext()->setContextProperty("jsonHandler", &jsonHandler);

    const QUrl url(u"qrc:/main.qml"_qs);
    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                     &app, [url](QObject *obj, const QUrl &objUrl) {
        if (!obj && url == objUrl)
            QCoreApplication::exit(-1);
    }, Qt::QueuedConnection);
    engine.load(url);

    return app.exec();
}

然后在QML里,用TextEdit组件绑定jsonHandler.jsonDisplayText,再加个按钮触发读取操作:

// main.qml
import QtQuick 2.15
import QtQuick.Window 2.15

Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("JSON数据展示")

    Column {
        anchors.centerIn: parent
        spacing: 10

        Button {
            text: "加载并展示JSON"
            onClicked: jsonHandler.display() // 点击按钮触发读取JSON
        }

        TextEdit {
            width: 600
            height: 400
            readOnly: true
            text: jsonHandler.jsonDisplayText // 绑定C++的属性
            wrapMode: TextEdit.WordWrap
            font.family: "Courier New" // 用等宽字体显示JSON更美观
        }
    }
}

这样,当你点击按钮时,C++的display函数会读取JSON文件,把文本存到属性里,QML的TextEdit就会自动更新显示内容啦!

内容的提问来源于stack exchange,提问作者Dan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 21:07:42