QT之調用EChart (二)

一 前言

之前寫過一篇QT怎麼調用EChart的文章,在文章中有寫到關於EChart與QT窗口自適應問題。最近由於項目中需要用到這一技術,所以在做項目過程中,有新的體會。

https://blog.csdn.net/octdream/article/details/90482654

二 效果圖

二 功能實現

1 新建一個GUI工程

2 在ui編輯器中,在窗口中新增一個QWidget並設置主窗口的自動佈局。

3 將新增的QWidget提升爲QWebEngineView

4 編寫html文件(重點)

<!DOCTYPE html>
<head>
    <meta charset="utf-8">
    <title>ECharts</title>
</head>
<body>
<!-- 爲ECharts準備一個具備大小(寬高)的Dom -->
<div id="clicked_forward_chart" style="height:500px"></div>
<!-- ECharts單文件引入 -->
<script src="build/dist/echarts.js"></script>
<script type="text/javascript">
    var clickedForwardChart;
    var xx;
    var dataClicked;
    var dataForward;
    function setClickedForwardDatta(scale, clicked, forward) {
        xx = scale.split(",");
        dataClicked = clicked.split(",");
        dataForward = forward.split(",");
    }

    // 路徑配置
    require.config({
        paths: {
            echarts: 'build/dist'
        }
    });

    require(
        [
            'echarts',
            'echarts/chart/bar'
        ],
        function (ec) {
            clickedForwardChart = ec.init(document.getElementById('clicked_forward_chart'), 'macarons');
            setClickedForwardDatta("0,1,2,3,4,5", "0", "0");

            var option = {
                animation: false,
                title: {
                    text: '事件點擊率與轉發率統計'
                },
                tooltip: {
                    trigger: 'axis'
                },
                legend: {
                    data: ['點擊率', '轉發率']
                },
                calculable: true,
                xAxis: [
                    {
                        type: 'category',
                        data: xx,
                        axisLabel: {
                            interval:0,
                            rotate:40
                        }
                    }
                ],
                yAxis: [
                    {
                        type: 'value',
                        max: 1.5,
                        min: 0
                    }
                ],
                series: [
                    {
                        name: '點擊率',
                        type: 'bar',
                        data: dataClicked,
                    },
                    {
                        name: '轉發率',
                        type: 'bar',
                        data: dataForward,
                    }
                ]
            };

            //窗體自適應

            //window.onresize = clickedForwardChart.resize;
            // 爲echarts對象加載數據
            clickedForwardChart.setOption(option);
        }
    );

    function updateClickedForwardData(scale, clicked, forward) {
        if (!clickedForwardChart) {
            return;
        }

        setClickedForwardDatta(scale, clicked, forward);
        //更新數據
        var option = clickedForwardChart.getOption();
        option.xAxis[0].data = xx;
        option.series[0].data = dataClicked;
        option.series[1].data = dataForward;
        clickedForwardChart.clear();
        clickedForwardChart.setOption(option);
    }
</script>

<script>
    function resizeWindow() {
        window.onresize = function () {
            clickedForwardChart.resize();
        }
    }

    resizeWindow();
</script>

</body>

注意:

1)用於加載EChart的<div>標籤需要設置高度樣式,不然顯示不出來,寬度不需要設置

2)底下的JS代碼resizeWindow一定要加,並且一定要調用resizeWindow,這樣纔會自動設置窗口。

4 在cpp文件中,爲提升的QWidget控件,加載html文件

EchartMainWin::EchartMainWin(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::EchartMainWin)
{
    ui->setupUi(this);
    ui->widget->load(QUrl("E:/workspace/QT_PRJ/echartsTest/htmlEcharts/KDStatisticalChart.html"));

}

5 在CPP文件中,添加加載數據功能

void EchartMainWin::on_pushButton_load_clicked()
{
    QString xx = "事件1,事件2,事件3,事件4,事件5,事件6,事件7,事件8,事件9,事件10,事件11,事件12";
    QString clicked = "2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 80.6, 70.2, 32.6, 20.0, 6.4, 3.3";
    QString forward = "2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 80.6, 70.2, 48.7, 18.8, 6.0, 2.3";

    QString strVal = QString("updateClickedForwardData(\"%1\",\"%2\",\"%3\");").arg(xx).arg(clicked).arg(forward);
    ui->widget->page()->runJavaScript(strVal);
}

6 如果要在頁面中添加兩個圖表,只需要按上面的依葫蘆畫瓢即可

 a)新增一個<div>標籤並設置高度

<div id="other_chart" style="height:400px"></div>

b)新增一個<javascript>標籤,用於加載第二個圖的數據

<script type="text/javascript">
    var myChart;
    var otherX;
    var dataMood;

    function setOtherData(scale, mood) {
        otherX = scale.split(",");
        dataMood = mood.split(",");
    }

    // 路徑配置
    require.config({
        paths: {
            echarts: 'build/dist'
        }
    });

    // 使用
    require(
        [
            'echarts',
            'echarts/chart/line'
        ],
        function (ec) {
            // 基於準備好的dom,初始化echarts圖表
            myChart = ec.init(document.getElementById('other_chart'), 'macarons');
            setOtherData("0,1,2,3,4,5", "0")
            var option = {
                animation: false,
                title: {
                    text: '情緒與政治傾向折線圖'
                },
                tooltip: {
                    trigger: 'axis'
                },
                legend: {
                    data: ['情緒值']
                },
                calculable: true,
                xAxis: [
                    {
                        type: 'category',
                        boundaryGap: false,
                        //data : ['0','1','2','3','4','5']
                        data: otherX
                    }
                ],
                yAxis: [
                    {
                        type: 'value',
                        scale: true,
                        name: '情緒值',
                        boundaryGap: [0.2, 0.2]
                    }

                ],
                series: [
                    {
                        name: '情緒值',
                        type: 'line',
                        data: dataMood,
                        symbol: 'none'  //取消折點圓圈
                        //data:[0,1,2,3,4,5],
                    }
                ]
            };
            //窗體自適應
            //window.onresize = myChart.resize;
            // 爲echarts對象加載數據
            myChart.setOption(option);
        }
    );

    function updateOtherData(scale, mood) {
        if (!myChart) {
            return;
        }

        setOtherData(scale, mood);
        //更新數據
        var option = myChart.getOption();
        option.xAxis[0].data = otherX;
        option.series[0].data = dataMood;
        myChart.clear();
        myChart.setOption(option);
    }
</script>

c)在窗口自適應中新增新圖表的窗口重繪

<script>
    function resizeWindow() {
        window.onresize = function () {
            clickedForwardChart.resize();
            myChart.resize();
        }
    }

    resizeWindow();
</script>

d) 在CPP中添加新增圖表數據加載功能

#include <QTimer>

int g_Amplitude = 25;
int g_Cycle = 6;
int g_SinOffset = 135;
int g_AxisIndex = 0;


EchartMainWin::EchartMainWin(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::EchartMainWin)
{
    ui->setupUi(this);
    ui->widget->load(QUrl("E:/workspace/QT_PRJ/echartsTest/htmlEcharts/KDStatisticalChart.html"));


}

 

void EchartMainWin::on_pushButton_load_2_clicked()
{
    timer = new QTimer(this);
    timer->setInterval(1000);
    connect(timer, SIGNAL(timeout()), this, SLOT(updateValue()));
    timer->start();
}

void EchartMainWin::updateValue()
{
    double g_AxisY = g_Amplitude * sin( 3.141592654 /  g_Cycle *  g_AxisIndex ) + g_SinOffset;
    mood.append(QString::number(g_AxisY));
    g_AxisIndex++;
    
    x.append(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"));

    QString strVal = QString("updateOtherData(\"%1\",\"%2\");").arg(x.join(",")).arg(mood.join(","));
    ui->widget->page()->runJavaScript(strVal);
}

 

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