整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          Qt開源作品5-儀表盤交互

          Qt開源作品5-儀表盤交互

          # 一、前言

          Echart是百度研發團隊開發的一款報表視圖JS插件,功能十分強大,是本人用過的國產作品中最牛逼的,記得四五年前就在qt中使用過,當時用的瀏覽器控件是webkit,由于5.6以后的版本不再支持webkit,而換用webengine內核,很多人在下載使用后不能正常編譯,今天特意抽空做個webengine版本,使得同時支持webkit和webengine。

          在webkit中執行JS用的是webView->page()->mainFrame()->evaluateJavaScript(js);

          而webengine用的是webView->page()->runJavaScript(js);

          在執行效率上,webengine甩webkit好幾條街,在拖動滑塊動態設置值的時候,webengine的CPU占用只有1%,而webkit居然達到了7%,恐怖!怪不得webkit逐漸被qt拋棄了,webengine只是內存使用上增加了些。

          ## 二、代碼思路

          第一步:準備網頁文件
          ```c++
          <html>
          <head>
              <meta charset="utf-8">
              <title>ECharts</title>
              <script src="echarts.min.js"></script>
          </head>
          <body>
              <div id="main" style="height:300px;"></div>
          </body>
          </html>
          ```
          
          第二步:準備JS函數
          ```c++
          function setGaugeValue(value){
              var option={
              tooltip : {
                  formatter: "{a} <br/>{b} : {c}%"
              },
              toolbox: {
                  feature: {
                      restore: {},
                      saveAsImage: {}
                  }
              },
              series: [
                  {
                      name: '業務指標',
                      type: 'gauge',
                      detail: {formatter:'{value}%'},
                      data: [{value: value, name: '完成率'}]
                  }
              ]
            };
          ```
          
          第三步:數據交互
          ```c++
          void Widget::on_horizontalSlider_valueChanged(int value)
          {
              QString js=QString("setGaugeValue(%1)").arg(value);
          #ifdef webkit
              webView->page()->mainFrame()->evaluateJavaScript(js);
          #else
              webView->page()->runJavaScript(js);
          #endif
          }

          ## 三、效果圖



          ## 四、開源主頁

          1. 國內站點:[https://gitee.com/feiyangqingyun/QWidgetDemo](https://gitee.com/feiyangqingyun/QWidgetDemo)

          2. 國際站點:[https://github.com/feiyangqingyun/QWidgetDemo](https://github.com/feiyangqingyun/QWidgetDemo)

          于報表

          做嵌入式基本上用不到報表,但是桌面應用就經常會用到報表功能,在Qt下面可用的報表工具也挺多,需要根據具體的需求來選擇,報表有的格式比較規矩,有的則比較特殊,所以要結合具體需求來選擇合適的方案。

          Qt報表常見方案

          我所知道的常見的Qt報表實現方案如下:

          • 通過 ActiveX讀寫word,在word文檔里實現表格的繪制。也可以操作excel文件,但是依賴微軟的COM組件;
          • Qxlsx開源的表格操作代碼;這個就不依賴微軟的offic和COM組件了;
          • 第三方報表庫,也有開源的:cutereport、KDReports、limereport等等。由于項目急也沒有去細研究這些第三方的庫怎么使用。大家有時間可以看看
          • 通過html實現,這個需要結合QTextDocument,QTextDocument是富文本文檔類。
          • QPainter直接在QPrinter上繪制表格和數據,這個有點生猛了,也就是自己造輪子,但是也有好處,就是可控性比較強。

          簡單介紹下方案選擇

          • ActiveX依賴windows,不能跨平臺,如果你的軟件不需要跨平臺,也可以使用,功能還是挺強大的,可以預先用word做好模板,然后程序往模板里填充數據即可。
          • 第三方庫;如果是時間充足,可以學習學習那些第三方的開源報表庫,這些庫據說報表效果還是不錯的,功能強大。
          • QT開發交流+貲料君羊:714620761
          • Qxlsx;這個是比較強大的開源表格庫,可以生成excel表格文件,而且文件里還可以插入圖表(直方圖、曲線、折線圖、餅狀圖等等),我也是只用過其表格功能,使用比較簡單,可以直接引用其源碼的工程文件(.prj)。大部分情況都適用。
          • html;這種方案我也試了下,效果不好,主要是我對html一竅不通,用不好……
          • QPainter繪制;QPainter可以在任意QPaintDevice類上繪制各種圖形,既然可以繪制任意圖形,那自然可以繪制出來報表了,只是實現過程可能有點麻煩,需要計算規劃位置坐標之類的,但是非常靈活,報表如果比較復雜或者特殊,可以通過該方案繪制一個模板。

          第一次使用qt做報表打印,剛開始用的qxlsx,但是實現效果不是太好,因為報表里數據行數與列數不固定,而且要打印在一張A4紙上,用qxlsx實現起來比較麻煩。后來就換了html,也不理想,最后就用QPainter直接繪制的,效果還不錯,

          Qt中操作Word并導出報表可以使用QAxObject類來實現。QAxObject是Qt對ActiveX對象的封裝,可以用于與Microsoft Office應用程序進行交互。以下是一個簡單的示例代碼,演示如何使用Qt操作Word并導出報表:

          cpp復制代碼#include <QtWidgets>
          #include <QAxObject>
          
          void exportReportToWord(const QString& reportText, const QString& filePath) {
              QAxObject* wordApplication=new QAxObject("Word.Application", nullptr);
              wordApplication->setProperty("Visible", false);  // 設置Word應用程序不可見
          
              QAxObject* documents=wordApplication->querySubObject("Documents");
              QAxObject* document=documents->querySubObject("Add()");
          
              QAxObject* content=document->querySubObject("Content");
              content->dynamicCall("SetText(const QString&)", reportText);  // 將報表文本設置為Word文檔內容
          
              document->dynamicCall("SaveAs(const QString&)", filePath);  // 保存Word文檔到指定路徑
              document->dynamicCall("Close()");  // 關閉Word文檔
              wordApplication->dynamicCall("Quit()");  // 退出Word應用程序
          
              delete wordApplication;
          }
          
          int main(int argc, char *argv[]) {
              QApplication app(argc, argv);
          
              // 假設有一個報表文本
              QString report="報告內容...";
          
              // 導出報表到Word文件
              exportReportToWord(report, "report.docx");
          
              return app.exec();
          }
          

          在上述示例中,我們定義了一個exportReportToWord函數,該函數接收報表文本和導出路徑作為參數。在函數內部,我們創建了一個Word應用程序對象,并將其設置為不可見(Visible屬性設置為false)。

          然后,我們使用Documents對象創建一個新的Word文檔,并獲取文檔的Content對象。使用dynamicCall函數,我們通過SetText方法將報表文本設置為Word文檔的內容。

          接下來,使用dynamicCall的SaveAs方法將Word文檔保存到指定的文件路徑,并使用dynamicCall的Close方法關閉文檔。最后,使用dynamicCall的Quit方法退出Word應用程序。

          在main函數中,我們傳遞報表文本和導出路徑,調用exportReportToWord函數來導出報表到Word文件。

          請注意,上述示例僅為演示目的,實際應用中可能需要更復雜的操作,比如添加表格、設置樣式等。你可以根據具體需求使用QAxObject的各種方法和屬性進行操作。


          主站蜘蛛池模板: 久久久久人妻一区精品性色av| 国产精品无码一区二区三区在 | 精品视频一区二区三区在线观看| 色国产精品一区在线观看| 中文字幕人妻AV一区二区| 国产成人一区二区三区在线观看| 日韩美一区二区三区| 亚洲国产激情在线一区| 色窝窝无码一区二区三区色欲| 一区二区三区美女视频| 免费视频精品一区二区| 无码丰满熟妇浪潮一区二区AV| 精品一区二区三区在线观看视频| 丝袜人妻一区二区三区网站| 亚洲国产一区视频| 精品一区二区三区视频在线观看| 精品无人乱码一区二区三区| 亚洲一区二区三区国产精华液| 亚洲综合一区二区| 国产99视频精品一区| 国产日韩一区二区三区在线播放| 97久久精品一区二区三区| 精品一区二区三区在线观看视频| 天堂资源中文最新版在线一区| 久久精品国产一区二区三区肥胖| 国产一区二区三区久久| 无码日韩精品一区二区三区免费| 亚洲AV无码一区二区乱孑伦AS | 无码人妻精品一区二区| 麻豆aⅴ精品无码一区二区| 精品视频一区二区三三区四区| 精品一区二区三区免费毛片爱 | 亚洲蜜芽在线精品一区| 无码精品尤物一区二区三区| 欧美成人aaa片一区国产精品 | 九九无码人妻一区二区三区| 成人免费一区二区无码视频| 日韩精品人妻av一区二区三区| 日韩精品一区二区三区视频| 成人精品视频一区二区三区不卡| 一区二区视频在线|