使用QT的QChart写自己的示波器_QChart波形显示

2023-11-06

在这里插入图片描述
我几个月前最开始学习QT,就是从完成波形显示的功能开始的。之前工作的上位机需要有虚拟示波器功能,也就是波形显示。不曾玩过QT的小白,被安排学习完成一下。当时便选用QChart,根据领导需求也更新迭代过2次代码。

第一次参考大佬 ctrl c+v 完成个简单的显示。
https://www.cnblogs.com/lifexy/p/12150400.html

第二次参考大佬思路 ctrl c+v 优化了一次。
https://blog.csdn.net/qq_37700564/article/details/85271907

这周下班后,我把波形显示重构了一遍,基本达到我觉得日常使用的基本功能,也算一个QT 使用Qchart 的波形显示的库。

基本完成的功能和接口

  1. 加载数据波形
    • 1.追加点方式
    • 2.传入波形数据
  2. 支持16个通道
  3. 鼠标滑轮可以缩小放大
  4. 鼠标右键波形设置暂停开始
  5. 鼠标移动显示坐标
  6. 鼠标左键按住可以拖动波形
  7. 设置显示关闭某个通道
  8. 清楚某个通道数据
  9. 设置X轴Y轴范围
  10. 设置缩放比例
    在这里插入图片描述
    波形的数据控制:
  11. 使用map将通道和Line绑定,最终对线段操作的就是map。
  12. 整个波形的视图范围用两个变量
  13. 缩放倍数XY轴应该是相同的,但是也分别控制了。
  14. 通道用枚举定义了
enum  WAVE_CH
{
  WAVE_CH0,WAVE_CH1,WAVE_CH2,
  WAVE_CH3,WAVE_CH4,WAVE_CH5,
  WAVE_CH6,WAVE_CH7,WAVE_CH8,
  WAVE_CH9,WAVE_CH10, WAVE_CH11,
  WAVE_CH12,WAVE_CH13,WAVE_CH14,WAVE_CH15,
};
//  直线:  QLineSeries
//  平滑线  QSplineSeries
typedef  QLineSeries  SeriesType;
struct  Wave
{
  QMap<WAVE_CH,  SeriesType  *>  map_series;  //key:  ch,  value  SeriesType  *
  QChart  *chart;  //  图纸
  QValueAxis  *axisX,  *axisY;  //  xy轴
  double  rangeX,  rangeY;  //  控制XY的可视范围
  double  multipleX,  multipleY;  //  放大倍数,对应缩小倍数为1/multiple.
  double  last_point_x  =  0;
};

事件的控制变量

  1. 按键按下的变量
  2. 移动波形的XY的记录
  3. 波形暂停开始action
struct  Event
{
  bool  rightButtonPressed  =  false;
  bool  leftButtonPressed  =  false;
  QPoint  PressedPos;
  double  moveX,moveY;  //  记录移动
  bool  pauseWave;
  QMenu  *menu;
  QAction*  startAction;
  QAction*  pauseAction;
};

实现的接口

//  设置的通道数量
  #define  SET_GLOBLE_CHANNEL  16
  //  打开某个通道显示
  void  openChannel(WAVE_CH  ch);
  //  关闭某个通道显示
  void  closeChannel(WAVE_CH  ch);
  //  清除某个通道波形数据
  void  clearChannel(WAVE_CH  ch);
  //  追加某个通道的坐标点
  void  addSeriesData(WAVE_CH  ch,  const  QPointF&  point);
  //  传入某个通道的波形
  void  addSeriesData(WAVE_CH  ch,  const  QList<QPointF>&  point_list);
  //  设置X轴范围
  void  setRangeX(int  rangeX);
  //  设置Y轴范围
  void setRangeY(int  rangeY);
  //  设置X轴范围放大倍数,默认1.2,不可为0,对应缩小为1/multiple
  void  setZoomX(double  multiple);
  //  设置Y轴范围放大倍数,默认1.2,不可为0,对应缩小为1/multiple
  void  setZoomY(double  multiple);
  //  X轴范围按比例缩小
  void  ZoomOutX(void);
  //  X轴范围按比例放大
  void  ZoomX(void);
  //  Y轴范围按比例缩小
  void  ZoomOutY(void);
  //  Y轴范围按比例放大
  void  ZoomY(void);
  //  波形开始
  void  startGraph(void);
  //  波形暂停
  void  pauseGraph(void);
public  slots:
  //  波形开始槽函数
  void  slots_startGraph(void);
  //  波形暂停槽函数
  void  slots_pauseGraph(void);
protected:
  //  事件重写
  virtual  void  mouseMoveEvent(QMouseEvent  *pEvent)  override;
  virtual  void  mousePressEvent(QMouseEvent  *pEvent)  override;
  virtual  void  mouseReleaseEvent(QMouseEvent  *pEvent)  override;
  virtual  void  wheelEvent(QWheelEvent  *pEvent)  override;
  virtual  void  contextMenuEvent(QContextMenuEvent  *event)  override;

被抛弃的写随笔公众号改写技术文章了,感兴趣的可以关注公众号:王崇卫

回复“QT波形”,获取源码。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用QT的QChart写自己的示波器_QChart波形显示 的相关文章

  • QGraphicsScene没有删除QWidget的功能

    QGraphicsScene 有一个addWidget QWidget 有函数 但是没有对应的removeWidget QWidget 它只有removeItem QGraphicsItem 如何删除 QWidget 这是一个基本示例 看看
  • 另一个宏中的 Q_PROPERTY 宏

    如何放置Q PROPERTY另一个宏里面 辅助宏 define SimpleAllinOne member type public void Set member type arg member m member arg member ty
  • 第一个随机数始终小于其余随机数

    我碰巧注意到 在 C 中 使用 std rand 方法调用的第一个随机数大多数时候都明显小于第二个随机数 关于 Qt 实现 第一个几乎总是小几个数量级 qsrand QTime currentTime msec qDebug lt lt q
  • 如何为 qmlRegisterSingletonType 实现单例提供程序?

    我想在 QML 中使用 C 类作为 Singleton 实例 并认为我必须使用 qmlRegisterSingletonType 注册它们 此函数需要一个提供已注册 C 类的实例的函数 我在 Windows 上使用最新的 Qt 5 3 1
  • PyQt - 如何从给定的小部件获取顶级父级?

    给定的小部件如何访问它最旧的父级 即顶级小部件 我需要 showMinimized it 现在我正在使用 self parent parent parent showMinimized 但这似乎不是最好的方法 如果它移动了 我需要手动更改父
  • 使用 QTextCursor 选择一段文本

    使用 Qt 框架选择文本片段时遇到问题 例如 如果我有这个文件 没有时间休息 我想选择 ime for r 并从文档中删除这段文本 我应该如何使用 QTextCursor 来做到这一点 这是我的代码 QTextCursor cursor n
  • QML:无法读取未定义的属性“xxx”

    ApplicationWindow id root property string rootName rootName visible true width 800 height 400 title qsTr WatchFace Maker
  • 仅在内部/外部抚摸路径?

    Given a QPainterPath http qt project org doc qt 4 8 qpainterpath html如何仅在路径的内侧或外侧边缘 或非闭合路径的左侧或右侧 描边路径 QPainter strokePat
  • QComboBox 下拉项边距

    我想设计我的风格QComboBox为下拉项目留出边距 现在是这样的 我想要这样的东西 我尝试过 QComboBox QAbstractItemView item margin 3px 但它不起作用 你能帮我解决这个问题吗 您想在项目之间设置
  • 在没有加载器的情况下实例化内联组件

    有没有办法实例化内联Component 即在同一文件中定义 而不使用Loader 我不太关心使用的性能影响Loader因为我要用很多东西污染我的文件Loader包装纸 我发现从 JavaScript 创建动态 QML 对象 http doc
  • 获取 QListView 中所有可见项目的简单方法

    我正在尝试使用 Qt Framework 开发一个图像库应用程序 应用程序从所选文件夹加载所有图像 并使用 QListView 控件显示这些图像 但现在我想通过仅加载用户可见的图像来减少内存消耗 由于没有直接函数来获取视图中的所有可见项目
  • 使用 CMake 编译时更改头文件位置会导致缺少 vtable 错误

    对于一个大型 C 项目 我需要从 qmake 过渡到 CMake 但是在处理一个玩具示例时 我遇到了一些我不理解的行为 示例代码具有单个头文件 当该头文件移动到子目录中时 我收到 MainWindow 类缺少 vtable 的错误 CMak
  • 如何去除QWizard中的水平线?

    我正在研究一个样式表QWizard我想删除按钮上方的水平线 我尝试递归浏览所有小部件并将其边框设置为无 但似乎没有任何小部件具有此边框 这是我的代码 可以找到完整的可构建示例here https gist github com ardeid
  • 如何doxygen注释Qt属性?

    我想将 Doxygen 注释附加到我的 Q PROPERTY 例如 song h class Song public QObject Q OBJECT private Q PROPERTY QString title READ title
  • 覆盖 QWebView 中的页面回复

    我试图在 Qt 的 QWebView 中拦截页面 表单请求 并在某些情况下使用替代内容进行响应 QNetworkReply ngcBrowser createRequest Operation operation const QNetwor
  • Qt 5.1.1 与 Visual Studio 2012 - 这些 QT 版本无法访问

    打开 Visual Studio 时出现此错误 我安装自http qt project org downloads http qt project org downloads 适用于 Windows 64 位的 Qt 5 1 1 VS 20
  • 连接到 QNetworkReply::error 信号

    我正在使用 Qt5 的新连接语法 QNetworkReply 有一个名为error http qt project org doc qt 5 0 qtnetwork qnetworkreply html error 2还有一个函数叫做err
  • PyQt4 信号和槽

    我正在使用 PyQt4 编写我的第一个 Python 应用程序 我有一个 MainWindow 和一个 Dialog 类 它是 MainWindow 类的一部分 self loginDialog LoginDialog 我使用插槽和信号 这
  • QML 列表视图拖放

    我想创建两个 qml 列表视图 可以执行两个功能 拖放一个列表中的项目以更改项目的顺序 跨列表拖放项目 项目将从一个列表中删除并添加到另一个列表中 根据 Qt 文档中的拖放示例 我决定创建两个访问同一列表模型的列表视图 列表模型中的每个项目
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap

随机推荐

  • eclipse gradle打包_Spring Boot(十二):Spring Boot 如何测试打包部署

    部分面试资料链接 https pan baidu com s 1qDb2YoCopCHoQXH15jiLhA 密码 jsam 想获得全部面试必看资料 关注公众号 大家可以在公众号后台回复 知乎 即可 有很多网友会时不时的问我 Spring
  • 一个人的成功不是没有理由的!(人物之楼天城)

    昨天 杭州第十四中学请来毕业生楼天城 给全体学生做励志讲座 讲高中三年的学习生活和理科思维的培养 讲座前 老师介绍 楼天城同学2004年毕业于十四中 保送清华大学 博士毕业 是公认的计算机天才 公认的中国大学生编程竞赛第一人 常以一人单挑一
  • 利用python摘取文本中所需信息,并保存为txt格式

    项目所需 IC设计中难免会处理大量文本信息 我就在项目中遇到了 对于一个几万行的解码模块 提取出其中的指令 如果不用脚本将会很麻烦 下面我将一个小小的例子分享给大家 刚学python 如果有更方便的实现方法清多多指教 目的 1 在几万行解码
  • Git常用命令总结

    Git常用命令总结 git init 在本地新建一个repo 进入一个项目目录 执行git init 会初始化一个repo 并在当前文件夹下创建一个 git文件夹 git clone 获取一个url对应的远程Git repo 创建一个loc
  • openssl的证书链验证

    原文地址 http blog csdn net dog250 article details 5442914 使用openssl验证证书链可以用以下命令 debian home zhaoya openssl openssl verify C
  • C语言分支循环语句

    需提前看 初识C语言 5 C语言一些基本常识 目录 分支语句 if语句 单if语句使用 if else语句 if else if else语句 switch语句 switch基本结构 break作用 default作用 循环语句 while
  • 【Vscode

    Rmd文件转html R语言环境 Vscode扩展安装及配置 配置radian R依赖包 pandoc安装 配置pandoc环境变量 验证是否有效 转rmd为html 注意本文代码块均为R语言代码 在R语言环境下执行即可 R语言环境 官网中
  • shell I/O重定向

    shell重定向 lt 改变标准输入 program lt file 可将program 的标准输入改为file tr d r lt dos file txt 以 gt 改变标准输出 program gt file 可将program的标准
  • Qt基础之三十:百万级任务并发处理

    在实际的开发过程中 经常会遇到要处理大量任务场景 比如说压缩文件夹中的所有文件 对文件夹中的所有文件加密 上传文件夹中的所有文件到ftp等等 这里说百万级并不夸张 理论上文件夹中有任意多个文件都是可以的 本文以压缩文件夹中的100万张jpg
  • 三国志13pk版登录武将输入中文名方法与更改图像详解

    今天来个正经的文 三国志13里登录武将 设定姓名时 如果用的是自带输入法 就会出现一堆乱码 这时候 有两种解决方法 下载一个具有大五码的输入法 然后输入时候既要切换输入法 切换繁体 切换窗口模式 很麻烦 尤其在输入列传的时候 打很多字会很不
  • 【架构优化过程思考】技术方案评估的三个维度

    方案的选择决定了当下实现方案的资源投入及产出对产 也决定后续的成本 评估一个方案 首先要评估这个方案的有效性 也就是说要解决这个问题 实现目标 当前的这个方案是否足够的有效 还是在部分的场景下有效 如果是全部的有效那么该方案就不会出现上线之
  • 二叉树--合并二叉树

    问题 已知两颗二叉树 将它们合并成一颗二叉树 合并规则是 都存在的结点 就将结点值加起来 否则空的位置就由另一个树的结点来代替 思路 通过二叉树的前序遍历方法进行遍历 同时 t1二叉树作为蓝本进行计算 注意设置两个指针记录t1和t2遍历到的
  • JavaScript重写alert,confirm,prompt方法(JavaScript实现线程非阻塞式暂停和启动)

    得有段时间没好好写篇博客了 这次我们从一个题目开始吧 首先我给大家出一道题目 大家可以先思考一下 再往下看 题目是 请用JavaScript重写confirm方法 实现和confirm同样的功能 乍一看可能感觉很简单 定义一个confirm
  • php cms 自动分词,灵活运用PHPAnalysis分词组件,实现Phpcms v9关键词自动分词

    在2019年12月下旬 Phpcms官网phpcms cn关闭后 原有的分词api接口 http tool phpcms cn api get keywords php 已经失效 在录入标题后再也不能自动提取关键词到关键词的输入栏了 针对这
  • ReentrantLock的实现

    ReentrantLock可重入锁 我们可以利用这个实现对某一个操作约束为同有个时刻只能有一个线程能够操作 我们呢先看一下下面这个demo public class ReentrantLockTest public static void
  • 初级黑客入门指南——强烈推荐

    黑客指的是在计算机或计算机网络中发现弱点的人 尽管这个术语也可以指对计算机和计算机网络有深入了解的人 黑客的动机可能是多方面的 比如利润 抗议或挑战 围绕黑客发展的亚文化通常被称为 地下计算机 但现在它是一个开放的社区 虽然黑客这个词的其他
  • Python之由公司名推算出公司官网(余弦相似度)

    读大学时期写的博文 1 问题 对展会数据分类后 我的新任务是如何通过 公司名 公司地址 国家等海关数据推断出该公司的官网网站 若官网不存在则不考虑 以下数据仅供参考 公司名 国家 地址 JPW INDUSTRIES INC 427 NEW
  • 经典神经网络 -- DenseNet : 设计原理与pytorch实现

    原理 概念与网络结构 DenseNet模型 它的基本思路与ResNet一致 但是它建立的是前面所有层与后面层的密集连接 dense connection DenseNet的一大特色是通过 特征在channel上的连接 来实现特征重用 fea
  • 《Python笔记》安装(pip)第三方包报错

    目录 Python版本 报错信息 pip 安装numpy报错 pip 安装 scipy报错 pip 安装 pywin32 报错 解决办法 网络方法1 网络方法2 亲测解决方法 Python版本 python Python 3 8 10 ta
  • 使用QT的QChart写自己的示波器_QChart波形显示

    我几个月前最开始学习QT 就是从完成波形显示的功能开始的 之前工作的上位机需要有虚拟示波器功能 也就是波形显示 不曾玩过QT的小白 被安排学习完成一下 当时便选用QChart 根据领导需求也更新迭代过2次代码 第一次参考大佬 ctrl c