Qt配置,載入html,Echart, 交互


 

一、下載、安裝、配置

a)      http://download.qt.io/archive/qt/5.9/5.9.0/ 官方網站下載合適的版本;

  本次下載 qt-opensource-windows-x86-5.9.0.exe;並安裝;

b)      編譯器下載,本次要用到MSVC的編譯器,下載安裝visual studio 2017 版本(某博客說該版本支持 QWebEngineView)

c)      QT 安裝過程中缺少組件可在QT安裝目錄下找到 MaintenanceTool.exe 添加;

                 i.          需要注冊,或者更新 MaintenanceTool.exe;

                ii.          需要添加臨時鏡像 http://mirrors.ustc.edu.cn/qtproject/online/qtsdkrepository/windows_x86/root/qt/

               iii.          組件選擇時勾選要使用的QT相關的組件尤其是 webengine;

d)      環境變量配置;將QT編譯器的include 和 bin 添加到系統 path;(有說法不用配置)

                 i.          C:\Qt\Qt5.9.0\5.9\msvc2017_64\include

                ii.          C:\Qt\Qt5.9.0\5.9\msvc2017_64\bin

e)      打開Qt Creator ->工具->選項->構建和運行 配置Kit;

                 i.          主要包括 編譯器、調試器、Qt 版本 三個信息;

                ii.         

 

 

 

f)       打開QT安裝目錄下的Examples ;

                 i.          C:\Qt\Qt5.9.0\Examples\Qt-5.9\webenginewidgets

                ii.          編譯運行其中的 minimal項目,成功即可。

二、QT 項目結構簡介

 

 

 

 

三、QT 使用QWebEngineView 顯示 html

a)      工程文件 .pro 中添加  

QT  += webenginewidgets webchannel

                 i.          Webenginewidgets (web顯示類,用於顯示web界面)

                ii.          Webchannel(web數據通道類,用於數據通信)

b)      雙擊打開界面ui,在UI編輯器中添加一個widget,(建議改名,ganttChart)並將widget提升為“QWebEngineView” ;

c)      在工程中引入html文件和相關的js等資源;項目右鍵->Add Existing Directory

d)      在代碼中載入html; (添加對應的頭文件)  

QString htmlpath ="D:/Qt_project/QtCommDialog/demo1/a.html";
ui->ganttChart->load(QUrl(htmlPath)); 

e)      選擇MSVC 2017 編譯器運行即可顯示html頁面;

四、QT 調用前端 js

a)      QT是通過QWebEngineView來調用HTML頁面的,而HTML是通過JS來調用ECharts。因此QT可以通過QWebEngineView調用加載的html頁面中的JS方法,先將HTML頁面中JS設置ECharts屬性的那段代碼封裝成一個方法供QWebEngineView調用。

b)      在QT工程中的UI界面中增加一個QPushButton並添加信號和槽函數,在槽函數中添加如下代碼;

槽函數代碼:(封裝成 json 數據)

       QJsonObject seriesData;

       QJsonArray data1 = {1, 3, 9, 27, 81, 247};

       seriesData.insert("data1", data1);

       QString optionStr = QJsonDocument(seriesData).toJson();

       QString js = QString("init2(%1)").arg(optionStr);

      ui->ganttChart->page()->runJavaScript(js);

js 代碼:

function init2(str){

// 指定圖表的配置項和數據

var option = {

    title: {

        text: '第一個 ECharts 實例'

    },

    tooltip: {},

    legend: {

        data:['銷量']

    },

    xAxis: {

        data: ["襯衫","羊毛衫","雪紡衫","褲子","高跟鞋","襪子"]

    },

    yAxis: {},

    series: [{

        name: '銷量',

        type: 'bar',

        data: str["data1"]

    }]

};

// 使用剛指定的配置項和數據顯示圖表。

myChart.setOption(option);

}

五、Qt與前端交互Qwebchannel

a)      QWebEngine實現一個能打開網頁的簡單瀏覽器的基礎的項目;

b)      本地應用與網頁端之間的通訊過程,是通過信號和槽函數實現的,本地應用通過發送信號達到把信息發送到網頁端,而網頁端通過直接調用槽函數實現把信息傳到本地應用。很簡單,就是本地應用通過發送通訊類的信號通知網頁端,網頁端通過直接調用通訊類的槽函數來通知本地應用。網頁端對本地應用的操作一定要調用槽函數,寫在public slots 限定符下面的槽函數,不能是普通的public函數。

    流程:

                 i.          實現一個繼承於QObject的類(以下簡稱通信類),此類包含本地應用與網頁端通信的所有方法(信號,槽函數的方式);

 

                ii.          給本地應用的網頁載體QWebEnginePage對象注冊通信類對象;

 

 

 

               iii.          網頁實現中引入qwebchannel.js,創建網頁端的QWebChannel對象並與本地應用的通信類對像進行關聯,最終實現網頁端能夠直接訪問通信類的方法與本地應用進行通訊;

六、信號槽函數使用

signals:

        void findNext(const QString &str, Qt::CaseSensitivity cs);

        void findPrevious(const QString &str, Qt::CaseSensitivity cs);

private slots:

        void findClicked();

        void enableFindButton(const QString &text);

a)      發送信號  emit findPrevious(text, cs);

b)      槽函數:需要在GUI里添加;

c)      connect(ui->pushButton_2,SIGNAL(clicked()),this, SLOT(onResizeEcharts()));

d)      一個信號可以連接多個槽函數,這些槽會一個接一個的被調用,但是它們的調用順序是不確定的。

七、Shared library

a)      創建動態鏈接庫

                 i.          創建Library項目

                ii.          創建UI文件

               iii.          編輯UI文件,添加widget 提升為QWebEngineView;

               iv.          根據UI文件編輯頭文件和源文件(將代碼和UI關聯,然后在代碼控制UI控件)

b)      使用動態鏈接庫

                 i.          創建項目

                ii.          將動態鏈接庫的四個文件拷貝到項目目錄下

               iii.          編輯項目的pro文件

        INCLUDEPATH 這一行就是為了讓我們的項目可以找到 ganttchardll.h 和 ganttchardll_global.h 這兩個文件,你需要把這里的路徑替換成符合你的工程的路徑。LIBS 這一行則需要告訴編譯器(注意,這里是編譯器)到哪里去找到這個 dll 文件。

               iv.          編輯源文件

                v.          找到工程下的exe文件,運行缺少dll,將dll復制到當前文件;(運行時需要dll,查找順序:當前路徑-系統路徑)

 

 

 

               vi.          運行即可。

 

 

 

c)      更新dll

共享庫的一個好處是可以動態加載,也就是說,如果你需要升級程序,那么就要簡單的替換掉這個 dll 就好了,不需要要求用戶重新安裝全部文件。當然,這些 dll 也是有缺點的:動態加載的東西肯定會比靜態編譯的東西效率低一些。不過在現在的硬件環境下,這點性能損失已經可以忽略不計了。

1、修改共享庫的代碼,添加一個按鈕,槽函數為點擊關閉。

2、選擇重新構建項目

3、將項目目錄下的dll替換新的dll。

4、運行即可

 

 

 

八、項目源碼

https://github.com/HuangChunying/QtCommDialog

https://github.com/HuangChunying/QtCommHtmlDemo

https://github.com/HuangChunying/ganttchardll

https://github.com/HuangChunying/TestGanttDll

九、參考文獻

Qt 基礎通識:

https://www.w3cschool.cn/learnroadqt/tufx1j3q.html

http://c.biancheng.net/view/1824.html

 

qt加載EChart 調用js:

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

Qt UI和 代碼關聯:

https://blog.csdn.net/tennysonsky/article/details/48030333

 

Qt 動態鏈接庫:

https://blog.csdn.net/q496713258/article/details/6990837

 

qt html webchannel 通信:

https://blog.csdn.net/Y_Bingo/article/details/82954940?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-2

 


免責聲明!

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



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