使用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波形显示 的相关文章

  • 如何管理返回到 QML 的动态分配的 QObject 的生命周期?

    我有这个代码 QVariant componentFromCode QString code QQmlComponent component new QQmlComponent engine engine gt setObjectOwner
  • QT“找不到 Qt 平台插件“xcb””

    我出于学术原因安装了QT everywhere 5 15开源版 但无法运行程序 首先 我编译了必要的源文件make并安装了QT Creator 然后我选择qmake来运行其中的程序 当我尝试运行示例程序时 遇到以下错误 qt qpa plu
  • 为 Visual Studio 2012 编译 Qt 4.8.x

    我应该采取哪些步骤来编译适用于 Visual Studio 2012 的 Qt 版本 4 8 x 我已经仔细遵循了已接受答案中的说明这个问题 https stackoverflow com questions 5601950 how to
  • 如何使用 Qt Test 控制 QFileDialog?

    我有两个问题 我怎样才能访问QFileDialog并使用 Qt Test 模块在 文件名 字段中写入文件的路径 我这么问是因为我正在 Qt 中开发一些 GUI 测试 现在我需要打开一个文本文件 以下代码创建QFileDialog并获取文件路
  • 如何在 QTableWidget 的行和列中自动换行文本?

    I tried QTableWidget j new QTableWidget 10000 5 centralWidget j gt setColumnWidth 0 500 j gt setColumnWidth 1 30 j gt se
  • cx_freeze:QODBC 驱动程序未加载

    我的 python 应用程序如下所示 test py from PyQt4 import QtCore from PyQt4 import QtGui from PyQt4 import QtSql import sys import at
  • Qt GUI 编程设计

    我正在尝试创建一个 GUI 应用程序 主窗口 一个QMainWindow 包含 9 个固定大小的标签以及主窗口的大小 我尝试在没有 Qt GUI Designer 的情况下以编程方式制作它 该项目构建时没有错误 但我看不到主窗口上显示的任何
  • Qt 计算和比较密码哈希

    目前正在 Qt 中为测验程序构建面向 Web 的身份验证服务 据我了解 在数据库中存储用户密码时 必须对其进行隐藏 以防落入坏人之手 流行的方法似乎是添加的过程Salt https en wikipedia org wiki Salt cr
  • QLineEdit:显示处理后的文本,而不是输入的文本,但保留它(自定义回显模式)

    我想要一个QLineEdit不显示输入的文本 而是显示经过处理的版本 同时保留原始文本并在通过请求时返回它text 就像密码回显模式一样 但我不希望每个字符都被屏蔽 我想虚拟化空间 例如什么时候some text with spaces i
  • QT 中只获取文件而不获取目录?

    当我这样做时 QDir myDir home some location QStringList filesList myDir entryList 它返回该位置内的文件和目录 但我只想要文件 并且这些文件可以具有任意扩展名 有任何想法吗
  • 当 QML 对象不可见时防止 QML 属性绑定?

    我正在开发一个具有大量属性绑定的 QML 应用程序 数百个对象被跟踪并以不同的形式显示 例如 Qt3D QCanvas 当我在应用程序的单独页面上时 x y 位置和相对大小的属性绑定仍在发生 我怎样才能阻止他们 我知道我可以根据属性是否可视
  • 如何在 Qt-Embedded 中(正确)输出多语言文本?

    我的目标系统是 linux 3 3 7 Qt Embedded 开源版 4 8 Droid 字体 取自 fonts droid 20111207 git 1 all deb Debian 软件包并复制到 usr lib fonts目录 主要
  • QT/QML Android App,点击通知栏时打开应用程序

    我为 Android 应用程序制作了一个 QT 当我单击平板电脑中上面看到的按钮通知栏时 但是 如果单击通知 我的应用程序将打开 聚焦 不知道 并显示黑色窗口 简单来说怎么做呢 我的代码是 package org ays operation
  • (如何)我可以抑制未找到包配置文件的警告吗?

    我正在尝试创建一个CMakeLists txt尝试查找的文件Qt5 如果失败 则尝试回退到Qt4安装 该脚本到目前为止有效 但如果出现以下情况我总会收到警告Qt5未安装 注意FindQt5 cmake是由提供Qt5并且仅当以下情况时才可用Q
  • Qt mouseReleaseEvent() 未触发?

    我有一个显示图片的库 我们称之为 PictureGLWidget 其中 class PictureGLWidget public QGLWidget 所以 PictureGLWidget 扩展了 QGLWidget 在PictureGlWi
  • 如何在模型更改时停止ListView“跳跃”

    我需要做什么 我需要创建一个聊天窗口用一个ListView在 QML 中存储聊天消息 我设置listView positionViewAtEnd 以便跟踪最后的消息 我禁用positionViewAtEnd当我向上滚动时 我可以阅读过去的消
  • 禁用 QML Slider 的鼠标滚轮

    我希望能够滚动Flickable使用鼠标滚轮 或触摸板上的两根手指 不改变Sliders它可能包含 示例代码及结果应用 import QtQuick 2 7 import QtQuick Window 2 2 import QtQuick
  • 在 Qt5 中,是否需要 Q_INVOKABLE 来从 QML 调用公共 QObject 函数?

    我刚刚意识到我可以调用暴露于 QML 的对象的几乎任何函数 现在我对 Q INVOKABLE 很好奇 Qt5docs http doc qt io qt 5 qtqml cppintegration exposecppattributes
  • Qt 文件对话框默认后缀不起作用

    我将以下代码用于 QtQuick Dialogs 1 3 和 Qt 5 10 0 下 filedialog 的新属性 我使用 Qt Creator 5 10 默认套件构建它 import QtQuick 2 10 import QtQuic
  • 如何创建用于 QML 的通用对象模型?

    我想知道是否有任何宏或方法如何将 Qt 模型注册为 QObject 的属性 例如 我有AnimalModel http doc qt io qt 5 qtquick modelviewsdata cppmodels html qabstra

随机推荐

  • 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