QT通過加載JS腳本文件顯示常用圖表(折線,柱狀,圓餅等)

1、效果預覽查看

在這裏插入圖片描述

2、初始化窗體,準備腳本文本

  • JS文件的修改,需要對JS最基本的認識,對應Javascript的學習,可以嘗試此鏈接進行學習 https://www.w3school.com.cn/js/index.asp
  • 其他更多優秀的樣式JS文件,可以通過參考網址:https://www.echartsjs.com/zh/index.html 進行研究學習
  • 這裏貼出其中折線圖JS文本,全部代碼請從博文最後根據鏈接下載

<html>
<head>
    <meta charset="utf-8">
    <title>折線圖</title>
    <!-- 引入 echarts.js -->
    <script src="./echarts.min.js"></script>
<!--    <script src="https://cdn.staticfile.org/echarts/4.3.0/echarts.min.js"></script>-->
</head>
<body>
    <div id="main" style="height:420px;"></div>
    <script type="text/javascript">
        var myChart = echarts.init(document.getElementById('main'));

        option = {
   
   
             tooltip: {
   
   
                trigger: 'axis'
            },
            legend: {
   
   
                data: ['最高氣溫', '最低氣溫']
            },
            toolbox: {
   
   
                show: true,
                feature: {
   
   
                    dataView: {
   
   readOnly: false},
                    magicType: {
   
   type: ['line', 'bar']},
                }
            },
            xAxis: {
   
   
                type: 'category',
                boundaryGap: false,
                data: ['週一', '週二', '週三', '週四', '週五', '週六', '週日']
            },
            yAxis: {
   
   
                type: 'value'
            },
            series: [{
   
   
                name: "最高氣溫",
                data: [820, 932, 901, 934, 1290, 1330, 1320],
                type: 'line'
            },
            {
   
   
                name: "最低氣溫",
                data: [420, 732, 601, 734, 1390, 1530, 1120],
                type: 'line'
            }]
        };

        myChart.setOption(option);
        window.onresize = myChart.resize;

        // 定義函數,QT修改測試值
        function setDatas(str){
   
   
            var obj = JSON.parse(str);

            console.info(obj)

            option.series[0].data =  obj.series1;
            option.series[1].data =  obj.series2;

            myChart.setOption(option);
        };
    </script>
</body>
</html>

3、 JS函數與QT接口數據交互

本實例通過自動生成測試數據來應用JS數據的更改,具體見如下代碼。

// 生成測試數據
void cJsViewWidget::slotBtnCreatTestData()
{
   
   
    QVariantMap map;
    QVariantList varList1,varList2;

    for(int i=0;i<7;++i)
	{
   
   
        varList1 << (qrand() % 1000 );
        varList2 << (qrand() % 1000 );
    }

    map["series1"] = varList1;
    map["series2"] = varList2;

    QJsonDocument doc = QJsonDocument::fromVariant(map);
    QString str = doc.toJson(QJsonDocument::Compact);
    str.replace(QRegExp("\""), "\\\"");
    QString strVal = QString("setDatas(\"%1\");").arg(str);

	// 運行腳本
    ui->webview1->page()->runJavaScript(strVal);
}
  • JS方法函數,用來開放給QT修改數據
        // 定義函數,QT修改測試值
        function setDatas(str){
   
   
            var obj = JSON.parse(str);

            console.info(obj)

            option.series[0].data =  obj.series1;
            option.series[1].data =  obj.series2;

            myChart.setOption(option);
        };
    </script>

4、關鍵頭文件和源文件

// 頭文件
#pragma  once
#include <QWidget>

namespace Ui {
   
   
class JsViewWidget;
}

class cJsViewWidget : public QWidget
{
   
   
    Q_OBJECT

public:
    explicit cJsViewWidget(QWidget *parent = nullptr);
    ~cJsViewWidget();

private slots:
    void slotComboBoxChangeIndex(int index);
    void slotBtnCreatTestData();

private:
    Ui::JsViewWidget *ui;
};

// 源文件
#include "JsViewWidget.h"
#include "ui_JsViewWidget.h"

#include <QVariantMap>
#include <QJsonDocument>
#include <QDateTime>
#include <QtMath>

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

	// 添加下拉框單元項
	QStringList strNamesList{
   
   QString::fromLocal8Bit("折線圖")
	,QString::fromLocal8Bit("柱狀圖") 
	,QString::fromLocal8Bit("餅狀圖")
	,QString::fromLocal8Bit("雷達圖") 
	,QString::fromLocal8Bit("散點圖") 
	,QString::fromLocal8Bit("儀表盤") 
	,QString::fromLocal8Bit("關係圖") 
	,QString::fromLocal8Bit("中國地圖") 
	,QString::fromLocal8Bit(" 省地圖")
	};

	ui->comboBox->addItems(strNamesList);
    slotComboBoxChangeIndex(0);

	// 建立信號連接
	connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(slotBtnCreatTestData()));
	connect(ui->comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotComboBoxChangeIndex(int)));
}

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

// 下拉框槽函數
void cJsViewWidget::slotComboBoxChangeIndex(int index)
{
   
   
    ui->pushButton->setVisible(index == 0);

	// 加載腳本數據
    QString url = QString("qrc:/html/view%1.html").arg(index+1);
    ui->webview1->load(QUrl(url));
}

// 生成測試數據
void cJsViewWidget::slotBtnCreatTestData()
{
   
   
    QVariantMap map;
    QVariantList varList1,varList2;

    for(int i=0;i<7;++i)
	{
   
   
        varList1 << (qrand() % 1000 );
        varList2 << (qrand() % 1000 );
    }

    map["series1"] = varList1;
    map["series2"] = varList2;

    QJsonDocument doc = QJsonDocument::fromVariant(map);
    QString str = doc.toJson(QJsonDocument::Compact);
    str.replace(QRegExp("\""), "\\\"");
    QString strVal = QString("setDatas(\"%1\");").arg(str);

	// 運行腳本
    ui->webview1->page()->runJavaScript(strVal);
}

5、 本次實例代碼下載鏈接

全部代碼下載鏈接: https://download.csdn.net/download/u013083044/14982917

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章