Qwt7.0-打造更美觀高效的Qt開源繪圖控件庫

概述

Qt 生態里能畫圖的庫不多,主流的為QCustomPlotQwtQt ChartsKDChart,Qt6.8之后把原來的 Qt Charts(2D) 與 Qt DataVisualization(3D) 合并為統一的Qt Graphs模塊(注意不是Qt Graphics),底層全部基于 Qt Quick Scene Graph(QSG)+ Qt Quick 3D,徹底放棄了老舊的 Graphics-View/QPainter 管線,不過Qt Graphs 須通過 QQuickWidget 或 QQuickWindow 嵌入,必須帶 QML runtime,C++支持不足,論壇吐槽不少,雖然Qt Graphs 是 Qt 官方“大一統”的未來,但這個未來可能3年內不會到來,且不支持win7等老系統,對嵌入式也不友好,因此,QCustomPlotQwtQt ChartsKDChart還會是最近幾年繪圖控件的選項。

這幾個控件QCustomPlot最簡單、美觀,推廣度最高,只要引入qcustomplot.h頭文件,qcustomplot.cpp源文件,就可以直接使用(官方文檔),也支持Qt6,然而QCustomPlot最大的問題是其開源協議為GPL,有傳染性,如果你使用了QCustomPlot,意味著你的軟件也要成為GPL,這對商業非常不友好。

Qwt是老牌的繪圖控件(官方文檔),有著不錯的性能,但部署難,讓很多人望而怯步。它的協議為LGPL,商業相對友好。

Qt Charts是Qt官方的繪圖控件(官方文檔),效率不高(可以說很低),不適合做科學計算,同時,Qt Charts 沒有 LGPL 選項,開源版是GPLv3,只要你在項目中使用了Qt Charts,就必須 把整個項目以 GPLv3 協議開源。

KDChart是KDAB的繪圖控件(官方文檔),KDChart3.0起是MIT協議,對商業非常友好,但渲染效果一般,一股excel2003的風格,但KDChart有甘特圖,這是上面3款都沒有的。

因此,如果你的項目需要商業用途,那么你只有QwtKDChart3.0兩種選擇,但Qwt作者停止更新,我個人更喜歡Qwt,因為Qwt的架構更符合軟件工程原則,其大規模渲染性能更優,像QCustomPlot的優勢是交互功能開箱即用,例如鼠標縮放,坐標軸縮放,而Qwt需要較多的代碼來實現,但Qwt有著更精細的控制能力,因此在我的項目需要繪圖的時候,我會選擇Qwt,并根據我的需求添加一些自己需要的功能,改進、優化它,因此,就有了此項目。

Qwt 7.0

我在Qwt最后版本上進行了維護,后續我將我需要的功能添加進去,同時逐步修改、優化一些已有的功能,例如它默認的老舊樣式

項目地址為:

Github:https://github.com/czyt1988/QWT

Gitee:https://gitee.com/czyt1988/QWT

下面是我的目標以及目前我已經完成的一些工作:

  • CMake支持
  • 支持Qt6
  • C++11優化
  • 合并為單一文件,簡化引入
  • 優化超大規模數據的渲染
  • 提供一些集成的交互方法,讓使用更簡單
  • 美化控件
  • 提供Figure實現繪圖的布局
  • 增加寄生軸的支持,實現n個坐標軸

總之,我將繼續維護Qwt,讓其成為一個協議友好,性能優越,方便使用的Qt繪圖庫

Qwt7.0的新特性

Cmake支持

Qwt7.0已經支持CMake,并且未來將考慮拋棄QMake

安裝Qwt后,你的項目只需如下即可引入Qwt,免去以往繁瑣的配置和預定義宏:

target_link_libraries(${YOU_APP_TARGET} PUBLIC qwt::qwt)

單一頭文件和源文件

參考QCustomPlot,我把原Qwt整個工程合并為QwtPlot.hQwtPlot.cpp,只要把這兩個文件引入項目即可使用:

cmake示例:

# QwtPlot依賴Core Gui Widgets Svg Concurrent OpenGL PrintSupport這幾個模塊,需要引入工程
find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED)
find_package(Qt${QT_VERSION_MAJOR} 5.8 COMPONENTS Core Gui Widgets Svg Concurrent OpenGL PrintSupport REQUIRED)add_executable(YOU_APP_TARGETmain.cppQwtPlot.hQwtPlot.cpp
)target_link_libraries(YOU_APP_TARGET PUBLICQt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Gui Qt${QT_VERSION_MAJOR}::WidgetsQt${QT_VERSION_MAJOR}::SvgQt${QT_VERSION_MAJOR}::ConcurrentQt${QT_VERSION_MAJOR}::OpenGLQt${QT_VERSION_MAJOR}::PrintSupport)

美化了風格

原有的Qwt樣式使用的是很老舊的浮雕風,和現代審美不符,為此我針對性的優化,qwt6.3的效果如下:

舊版qwt默認風格

優化后的效果如下:

新版qwt默認風格

主要去除了默認的凹陷風格,坐標軸緊貼繪圖不進行分離,總體視覺更符合現代風格

增加了Figure繪圖容器

類似Python的matplotlib,Qwt提供了Figure繪圖容器,可以很方便的進行多個繪圖布局

qwt figure

通過新增的QwtFigure類,可以很方便的進行多個繪圖布局,支持網格布局(類似matplotlib的subplot)

待辦事項

QwtFigure增加寄生軸功能

科學繪圖經常要求多個坐標軸,例如:一個繪圖區域,有多個Y軸,共享一個X軸,或者多個X軸,共享一個Y軸,目前就算QCustomPlot也只能實現同一個方向2個坐標軸,而不能無限多,為此,將參考matplotlib的實現,實現一個寄生軸功能,可以增加多個坐標軸

優化超大規模數據的渲染

針對超大規模數據,Qwt的并沒有做渲染優化,雖然現在對于百萬數據性能尚可,但300萬以上還是能感覺到有一定卡頓,后續將采取抽稀算法,優化超大規模數據的渲染,盡量能實現千萬至億級數據的快速渲染

添加一些集成的交互方法

提供一些開箱即用的交互方法,例如數據拾取,數據標尺,也同時參考EChart的一些效果進行集成


我將繼續維護Qwt,讓其成為一個協議友好,性能優越,方便使用的Qt繪圖庫,如果大家使用有什么需求,可以提出

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/94295.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/94295.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/94295.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

NFC線圈設計計算

對工作于13.56MHz的電感耦合的NFC系統,針對小距離的傳統天線通常是環形或者矩形的扁平線圈。 圓形扁平線圈計算評估 對于二階估計,我們可以由匝數決定的電感等式為 考慮到線圈的物理參數,設置平均直徑:D_averD0-N(gw) 線圈周長: ;d2*(w t)/π 初始設置中的這種電感…

mac設置鼠標滾輪方向

mac中滾輪的滑動方向和windows是相反的,如果需要設置和windows相同,設置如下:將自然滾動關閉即可。

QSpinBox的用法及其使用QSS對其美化

摘要 在現代應用程序開發中,提供一個直觀且用戶友好的界面至關重要。Qt框架提供了豐富的控件和工具,幫助開發者實現這一目標。本文將詳細介紹如何使用Qt的QSpinBox控件讓用戶輸入數值,并通過Qt Style Sheets (QSS) 美化界面,提升…

18 繼續學習

要設計出一個好的系統,需要多年的知識積累。有一個捷徑是研究真實世界的系統架構。本文將介紹一些有幫助的閱讀材料。 務必留意那些真實系統之間共通的原理和相同的底層技術。研究每個技術并了解它解決了什么問題, 這是一個鞏固基礎知識和完善設計過程的…

深度學習篇---混淆矩陣

要理解混淆矩陣(Confusion Matrix),我們可以從它的名字入手:它本質是一張 “幫你理清模型預測結果到底‘混淆’在哪里” 的表格,核心作用是評估分類模型的表現 —— 比如判斷一張圖片是 “貓” 還是 “狗”、一封郵件是…

MySQL重大隱患!mysqlpump的--set-gtid-purged參數在5.7和8.0的雷區

MySQLPump是MySQL官方提供的一個用于備份和恢復MySQL數據庫的工具。它于MySQL 5.7.8版本中首次引入,旨在提供一種快速、可靠且高效的備份和恢復解決方案。MySQL Pump首次支持了并行導出、壓縮導出,可以利用多核CPU來提高備份能力,在效率上要比…

低質量視頻變高清AI:告別模糊,重現清晰畫質

在數字時代,視頻內容的創作和消費日益普及,然而,許多早期拍攝或存儲的視頻,由于技術限制或壓縮等原因,往往存在畫質不佳的問題,如模糊、噪點多、分辨率低等。這不僅影響觀看體驗,也限制了這些珍…

Linux入門教程 第十二章 防火墻

文章目錄前言一、 iptables 概述Netfilter二、iptables 的表、鏈結構2.1 ptables的四表五鏈結構介紹2.1.1 四表五鏈2.1.2 四表2.1.3 **五鏈**2.2 數據包過濾的匹配流程(數據包到防火墻)2.2.1 規則鏈之間的匹配順序:主機型防火墻:2.2.2 規則鏈內的匹配順序…

單詞搜索+回溯法

題目&#xff1a;思考&#xff1a; 1.經典回溯 實現&#xff1a; class Solution { public:bool find_word(vector<vector<char>>&board,string word,int pos,int i,int j){bool retfalse;if (posword.size()-1) return board[i][j]word[pos];if (board[i][j…

【嵌入式開發 Linux 常用命令系列 8 -- git checkout 解沖突詳細介紹】

文章目錄1. Git 沖突產生的場景2. 沖突標記符號解釋3. git checkout --ours 和 git checkout --theirs語法含義使用場景4. 操作完成后的流程5. 舉例演示1. Git 沖突產生的場景 當你在 git merge、git rebase、git cherry-pick 等操作時&#xff0c;如果 同一個文件的同一部分在…

16-day13強化學習和訓練大模型

強化學習 強化學習和監督學習是機器學習中的兩種不同的學習范式 強化學習&#xff1a;目標是讓智能體通過與環境的交互&#xff0c;學習到一個最優策略&#xff0c;以最大化長期累積獎勵。 例如&#xff0c;在機器人導航任務中&#xff0c;智能體需要學習如何在復雜環境中移動&…

OpenAI o1:OpenAI最新推出的AI大語言模型,更擅長推理也更貴

本文轉載自&#xff1a;OpenAI o1&#xff1a;OpenAI最新推出的AI大語言模型&#xff0c;更擅長推理也更貴 - Hello123工具導航 ** 一、&#x1f916; OpenAI o1 是什么&#xff1f; OpenAI o1 是 2024 年推出的推理特化型 AI 模型&#xff0c;主打 “慢思考、深分析”&#…

自然語言處理——03 RNN及其變體

1 認識RNN 1.1 概念循環神經網絡 RNN &#xff08;Recurrent Neural Network&#xff0c;簡稱RNN&#xff09;——處理序列數據的神經網絡&#xff1b;一般以序列數據作為輸入&#xff0c;通過網絡內部的結構設計有效捕捉序列之間的關系特征&#xff0c;一般也是以序列形式進行…

量子計算基礎

量子計算 量子計算一般由三個基本步驟組成&#xff1a;制備輸入量子態、對于量子態執行幺正變換以及測量輸出態&#xff0c;這里將介紹這三個基本要素。 1 量子態 與經典計算中比特(bit)的概念相對應&#xff0c;量子計算中最小信息載體和處理單位是量子比特(quantum bit, or t…

Apache Maven 3.1.1 (eclipse luna)

Apache Maven 3.1.1 &#xff08;eclipse luna&#xff09;D:\apache-maven-3.1.1\binMAVEN_HOME:D:\apache-maven-3.1.1PATH:D:\apache-maven-3.1.1\binmvn -vMaven Integration for Eclipse(Luna)

應用篇#1:YOLOv8模型在Windows電腦攝像頭上的部署

一、前言如何部署YOLOv8模型在攝像頭上是完成模型應用必須解決的問題&#xff0c;通過使用“cv2”這個庫&#xff0c;可以完成對電腦攝像頭的調用&#xff08;本人Windows聯想&#xff09;&#xff0c;實時檢測并輸出圖像。二、代碼實現與解讀import warnings import cv2 from …

關于內存泄漏的一場討論

下面是以前&#xff08;大概2003、2004年吧&#xff09;在某BBS上的一場關于內存泄漏的討論。我先原樣貼出當時存檔的&#xff0c;如果C友友興趣&#xff0c;我再整理成文章。發信人: tianshangfei(天上飛的豬), 信區: C 標 題: 什么叫做內存泄漏&#xff0c;誰能定義一下呢 :…

Java全棧開發實戰:從基礎到微服務的深度解析

Java全棧開發實戰&#xff1a;從基礎到微服務的深度解析 一、面試官開場介紹 面試官&#xff08;微笑&#xff09;&#xff1a;你好&#xff0c;我是今天的面試官&#xff0c;我們公司是互聯網大廠&#xff0c;負責前端和后端的全棧開發。今天主要想了解你在技術方面的掌握情況…

深度學習--PyTorch代碼框架

一代碼import torch print(torch.__version__) # 驗證安裝的開發環境是否正確 MNIST 包含 70,000 張手寫數字圖像&#xff1b;60,000 張用于訓練&#xff0c;10,000 張用于測試。 圖像是灰度的&#xff0c;28x28 像素的&#xff0c;并且居中的&#xff0c;以減少預處理和加快運…

LinkedIn 自動消息發送工具

LinkedIn 自動消息發送工具說明文檔 一、項目概述 本項目是一個基于 Python 的自動化工具&#xff0c;用于批量向指定 LinkedIn 用戶發送消息。 核心功能包括&#xff1a; 讀取消息模板和 URL 列表&#xff1b;使用瀏覽器模擬操作&#xff0c;自動發送 LinkedIn 消息&#xff1…