C++ QT使用ECharts显示k线图、折线图

Echarts官网下载html和js示例

实际下载3个html和js文件

使用QWebEngineView展示

项目ui布局,创建3个按钮,右侧是QWebEngineView控件进行展示html

复制代码
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    connect(ui->rb_kline, &QRadioButton::toggled, this, &Widget::slots_toggled);
    connect(ui->rb_lines3d, &QRadioButton::toggled, this, &Widget::slots_toggled);
    connect(ui->rb_linesmooth, &QRadioButton::toggled, this, &Widget::slots_toggled);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::slots_toggled(bool toggled)
{
    if(toggled)
    {
        QRadioButton* senderRadioBtn = qobject_cast<QRadioButton*>(sender());
        if(!senderRadioBtn) return;

        QString exe_path = qApp->applicationDirPath();

        if(senderRadioBtn == ui->rb_kline)
        {
            QString kline =  exe_path + "/myecharts/candlestick-sh.html";
            ui->web_engine->setUrl(QUrl(kline));
        } else if(senderRadioBtn == ui->rb_lines3d)
        {
            QString lines3d =  exe_path + "/myecharts/lines3d-flights.html";
            ui->web_engine->setUrl(QUrl(lines3d));

        } else if(senderRadioBtn == ui->rb_linesmooth)
        {
            QString linesmooth =  exe_path + "/myecharts/line-smooth.html";
            ui->web_engine->setUrl(QUrl(linesmooth));
        }
    }
}

该案例是静态数据,下一节介绍QT动态设置Echarts数据进行展示

C++ QT动态设置echarts数据

C++ qt提供如下方法去调用javascript代码去动态设置数据

完整demo

布局

如下代码QWebEngineView界面加载完成在调用JS的方法去动态设置数据

复制代码
#include "widget.h"
#include "ui_widget.h"

#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 连接页面加载完成的信号
    connect(ui->web_view, &QWebEngineView::loadFinished, this, &Widget::onPageLoaded);

    QString exe_path = qApp->applicationDirPath()  + "/echarts/line-simple.html";
    // 加载ECharts页面
    ui->web_view->setUrl(QUrl(exe_path));
}

Widget::~Widget()
{
    delete ui;
}


//使用echarts默认数据
void Widget::on_btn_defaultData_clicked()
{
    //这里调用JavaScript的init()方法
    // 等待页面加载完成后再调用JavaScript
        if(ui->web_view->page()) {
            ui->web_view->page()->runJavaScript("init()", [this](const QVariant &result) {
                qDebug() << "init()函数调用完成";
            });
   }
}

void Widget::on_btn_redefineData_clicked()
{
    QJsonObject seriesData;

    //设置X轴数据
    QJsonArray dataX = {1,5,10,15,20,25,30,35,40};
    seriesData.insert("data_xAxis", dataX);

    //设置Y轴数据
    QJsonArray dataY = {100,70,1230,110,50,890,79,128,256};
    seriesData.insert("data_yAxis", dataY);

    QString optionStr = QJsonDocument(seriesData).toJson();
    QString js = QString("load_data(%1)").arg(optionStr);

    //C++调用js方法, 调用js的load_data方法并传入入参
    // 调用JavaScript函数
        if(ui->web_view->page()) {
            ui->web_view->page()->runJavaScript(js, [this](const QVariant &result) {
                qDebug() << "load_data()函数调用完成";
            });
        }
}

void Widget::onPageLoaded(bool ok)
{
    if(ok) {
        qDebug() << "Web页面加载完成";
            // 可以在这里执行一些初始化操作
    }
}

将line-simple.html和echarts.min.js放到运行目录下

line-simple.html

html 复制代码
<!--
	此示例下载自 https://echarts.apache.org/examples/zh/editor.html?c=line-simple
-->
<!DOCTYPE html>
<html lang="en" style="height: 100%">
<head>
  <meta charset="utf-8">
</head>
<body style="height: 100%; margin: 0">
  <div id="container" style="height: 100%"></div>

  
  <script type="text/javascript" src="https://fastly.jsdelivr.net/npm/echarts@5/dist/echarts.min.js"></script>
  
  <!-- Uncomment this line if you want to dataTool extension
  <script type="text/javascript" src="https://fastly.jsdelivr.net/npm/echarts@5/dist/extension/dataTool.min.js"></script>
  -->
  <!-- Uncomment this line if you want to use gl extension
  <script type="text/javascript" src="https://echarts.apache.org/zh/js/vendors/echarts-gl/dist/echarts-gl.min.js"></script>
  -->
  <!-- Uncomment this line if you want to echarts-stat extension
  <script type="text/javascript" src="https://echarts.apache.org/zh/js/vendors/echarts-stat/dist/ecStat.min.js"></script>
  -->
  <!-- Uncomment this line if you want to echarts-graph-modularity extension
  <script type="text/javascript" src="https://echarts.apache.org/zh/js/vendors/echarts-graph-modularity/dist/echarts-graph-modularity.min.js"></script>
  -->
  <!-- Uncomment this line if you want to use map
  <script type="text/javascript" src="https://fastly.jsdelivr.net/npm/echarts@4.9.0/map/js/world.js"></script>
  -->
  <!-- Uncomment these two lines if you want to use bmap extension
  <script type="text/javascript" src="https://api.map.baidu.com/api?v=3.0&ak=YOUR_API_KEY"></script>
  <script type="text/javascript" src="https://fastly.jsdelivr.net/npm/echarts@5/dist/extension/bmap.min.js"></script>
  -->

  <script type="text/javascript">
    var dom = document.getElementById('container');
    var myChart = echarts.init(dom, null, {
      renderer: 'canvas',
      useDirtyRect: false
    });
    var app = {};
	// 默认的图表配置
    var defaultOption = {
        xAxis: {
            type: 'category',
            data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
        },
        yAxis: {
            type: 'value'
        },
        series: [{
            data: [150, 230, 224, 218, 135, 147, 260],
            type: 'line'
        }]
    };

    // 当前图表配置
    var currentOption = null;

    // 初始化图表(加载默认数据)
    function init() {
        currentOption = defaultOption;
        if (currentOption && typeof currentOption === 'object') {
            myChart.setOption(currentOption);
        }
    }

    // 加载自定义数据
    function load_data(data) {
        if (!data) return;
        
        // 从C++传入的JSON数据中提取X轴和Y轴数据
        var dataX = data.data_xAxis || [];
        var dataY = data.data_yAxis || [];
        
        // 创建新的图表配置
        currentOption = {
            xAxis: {
                type: 'category',
                data: dataX
            },
            yAxis: {
                type: 'value'
            },
            series: [{
                data: dataY,
                type: 'line',
                smooth: true
            }]
        };
        
        // 应用配置
        if (currentOption && typeof currentOption === 'object') {
            myChart.setOption(currentOption);
        }
    }
    
    var option;

    option = {
  xAxis: {
    type: 'category',
    data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
  },
  yAxis: {
    type: 'value'
  },
  series: [
    {
      data: [150, 230, 224, 218, 135, 147, 260],
      type: 'line'
    }
  ]
};

    if (option && typeof option === 'object') {
      myChart.setOption(option);
    }
	
	// 页面加载时初始化图表
    window.onload = function() {
        init();
    }

    window.addEventListener('resize', myChart.resize);
  </script>
</body>
</html>

JS中init和load_data方法

这里就完成了C++ qt中去调用JavaScript中方法去动态设置echarts数据

DONE!!!

相关推荐
酉鬼女又兒14 分钟前
零基础快速入门前端蓝桥杯Web备考:BOM与定时器核心知识点详解(可用于备赛蓝桥杯Web应用开发)
开发语言·前端·javascript·职场和发展·蓝桥杯
望眼欲穿的程序猿15 分钟前
MacOS自定义安装Rust
开发语言·macos·rust
wjs202419 分钟前
CSS 动画:深入浅出的探索与实践
开发语言
wjs202423 分钟前
二分搜索树
开发语言
沐知全栈开发29 分钟前
Memcached delete 命令详解
开发语言
lly20240630 分钟前
Lua 基本语法
开发语言
格林威39 分钟前
Baumer相机铝型材表面划伤长度测量:实现损伤量化评估的 5 个关键技术,附 OpenCV+Halcon 实战代码!
开发语言·人工智能·数码相机·opencv·计算机视觉·c#·工业相机
计算机安禾40 分钟前
【数据结构与算法】第16篇:串(String)的定长顺序存储与朴素模式匹配
c语言·数据结构·c++·学习·算法·visual studio code·visual studio
AI科技星1 小时前
基于v≡c公设的理论优化方案
c语言·开发语言·算法·机器学习·数据挖掘
庞轩px1 小时前
【无标题】
java·开发语言·jvm