QML使用QtWebEngine顯示HTML【Echarts】


1、前言

雖然標題是Echarts,但是實際上是QML加載HTML,而Echarts提供酷炫的控件可以讓我們在HTML里使用,所以這邊文章核心是QML+HTML【注意不是Qt+HTML】。

很多博客都說了兩種方式加載HTML,如QtWebKit、QtWebEngine、QAxWidget。。這里需要注意:

①、QtWebKit:Qt5.6以后已經被Qt官方停止支持,還是不使用了吧;

②、QtWebEngine:Qt5.6以后提出,但是只能用MSVC版本,故如果程序只運行在Windows上,還是可以的,Linux就算了吧;

③、QAxWidget:Qt5.6以后的mingw版本,可以用來顯示網頁。【我記得對excel的的操作是用的QAxObject,查了一下,可以理解QAxWidget是顯示office,QAxObject是后台處理office】

 

本文是在QML中使用QtWebEngine顯示HTML,環境是VS2017+Qt5.14,編譯器使用MSVC2017_32

 

2、新建Quick工程

其實我是直接下載的網友的工程:https://blog.csdn.net/qq_27081181/article/details/100528492

 

 

 

 如圖,主要有:

echart-all.js:官方的js庫【https://echarts.baidu.com/echarts2/doc/example.html】

pie.html:使用了echarts的html,暫不討論咋實現的

main.qml:主qml,是個window,里面加載了pie.html

qml.qrc:資源文件,導入上面三個文件

main.cpp:main函數

 

3、相關代碼

①、pie.html:

<!DOCTYPE html>
<head>
    <meta charset="utf-8">
    <title>ECharts</title>
    <style>
           html,body,#echarts{
           margin:0px;
           padding:0px;
           width:100%;
           height:100%;
           }
    </style>
</head>
<body style="background: url(圖層4.png);">
    <!-- 為ECharts准備一個具備大小(寬高)的Dom -->
    <div id="echarts" style="height:100%"></div>
    <script type="text/javascript" src="echarts-all.js"></script>
    <script type="text/javascript">
    // 基於准備好的dom,初始化echarts實例
    var myChart = echarts.init(document.getElementById('echarts'));

    // 指定圖表的配置項和數據
    var option = {
    title : {
        text: '南丁格爾玫瑰圖',
        subtext: '純屬虛構',
        x:'center'
    },
    tooltip : {
        trigger: 'item',
        formatter: "{a} <br/>{b} : {c} ({d}%)"
    },
    legend: {
        x : 'center',
        y : 'bottom',
        data:['rose1','rose2','rose3','rose4','rose5','rose6','rose7','rose8']
    },
    toolbox: {
        show : true,
        feature : {
            mark : {show: true},
            dataView : {show: true, readOnly: false},
            magicType : {
                show: true, 
                type: ['pie', 'funnel']
            },
            restore : {show: true},
            saveAsImage : {show: true}
        }
    },
    calculable : true,
    series : [
        {
            name:'半徑模式',
            type:'pie',
            radius : [20, 110],
            center : ['25%', 200],
            roseType : 'radius',
            width: '40%',       // for funnel
            max: 40,            // for funnel
            itemStyle : {
                normal : {
                    label : {
                        show : false
                    },
                    labelLine : {
                        show : false
                    }
                },
                emphasis : {
                    label : {
                        show : true
                    },
                    labelLine : {
                        show : true
                    }
                }
            },
            data:[
                {value:10, name:'rose1'},
                {value:5, name:'rose2'},
                {value:15, name:'rose3'},
                {value:25, name:'rose4'},
                {value:20, name:'rose5'},
                {value:35, name:'rose6'},
                {value:30, name:'rose7'},
                {value:40, name:'rose8'}
            ]
        },
        {
            name:'面積模式',
            type:'pie',
            radius : [30, 110],
            center : ['75%', 200],
            roseType : 'area',
            x: '50%',               // for funnel
            max: 40,                // for funnel
            sort : 'ascending',     // for funnel
            data:[
                {value:10, name:'rose1'},
                {value:5, name:'rose2'},
                {value:15, name:'rose3'},
                {value:25, name:'rose4'},
                {value:20, name:'rose5'},
                {value:35, name:'rose6'},
                {value:30, name:'rose7'},
                {value:40, name:'rose8'}
            ]
        }
    ]
};
                    
// 使用剛指定的配置項和數據顯示圖表。
      myChart.setOption(option);
    </script>
</body>

 

②、main.qml

import QtQuick 2.7
import QtQuick.Window 2.2

import QtWebEngine 1.2

Window {
    visible: true
    width: 1080
    height: 800

    WebEngineView {
        id: sitemonitoryView
        width:parent.width
        height:parent.height
        backgroundColor: "transparent"
        anchors.centerIn: parent
        settings.javascriptEnabled : true
        settings.pluginsEnabled:true
        url:"qrc:/html/pie.html"
    }
}

 

 

③、main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QCoreApplication::setAttribute(Qt::AA_UseOpenGLES);
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;

    //注冊applicationDirPath給qml調用
    engine.rootContext()->setContextProperty(
    "applicationDirPath", QGuiApplication::applicationDirPath());

    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}

原作者沒有加這句話:

QCoreApplication::setAttribute(Qt::AA_UseOpenGLES);

但是我運行了會報錯,並且界面一動就會糊在一起,這句話是打開OPENGL

 

4、效果

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM