概述

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…