【嵌入式——QT】QWT应用

【嵌入式——QT】QWT应用

  • 概述
  • 步骤一
  • 步骤二
  • 步骤三
  • 代码声明
  • 代码实现
  • 图示

概述

QWT,全称Qt Widgets for Technical Applications,是一个基于Qt开发的第三方库。它主要为具有技术背景的程序提供GUI组件和一组实用类,用于生成各种统计图。QWT的主要功能包括二维绘图、刻度、滑块、刻度盘、罗盘、温度计、轮子和旋钮等,可用于控制或显示双精度类型的值、数组或范围。此外,QWT还支持任何Qt能够支持的系统环境,并兼容Qt4(4.4版本以上)和Qt5版本。在QWT的最新版本中,还提供了一些新的绘图控件以及对OpenGL的基本支持。总的来说,QWT是一个功能强大且灵活的库,可用于在Qt应用程序中创建各种技术图表和控件。

步骤一

官网下载qwt下载

步骤二

将下载好的qwt自己编译成静态库,生成主要的两个文件 qwtd.lib,qwt.lib。将文件封装成一个目录,并放在项目目录下。
在这里插入图片描述
在这里插入图片描述

步骤三

项目的.pro文件进行引入,代码如下

win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../QWT/lib/ -lqwt
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../QWT/lib/ -lqwtdINCLUDEPATH += $$PWD/../QWT/qwt-6.1.4/src
DEPENDPATH += $$PWD/../QWT/qwt-6.1.4/src

代码声明

头文件中引入

#include <qwt_legend.h>
#include <qwt_plot.h>
#include <qwt_plot_curve.h>
#include <qwt_plot_grid.h>
#include <qwt_plot_magnifier.h>
#include <qwt_plot_panner.h>
#include <qwt_plot_zoomer.h>
#include <qwt_point_data.h>

头文件中定义

//网格
QwtPlotGrid* grid;
//线
QwtPlotCurve* zone1Curve1;
QwtPlotCurve* zone1Curve2;
QwtPlotCurve* zone1Curve3;
QwtPlotCurve* zone1Curve4;
//X轴数据
QVector<double> xData;
double initXData = 200;
//Y轴数据
QVector<double> yData1;
QVector<double> yData2;
QVector<double> yData3;
QVector<double> yData4;
//x轴位置
double xPos = 1;
//x轴位置标识
int xPosFlag = 0;

代码实现

#include "SubWidget.h"
#include "ui_SubWidget.h"
#include <QDate>SubWidget::SubWidget(QWidget* parent, QString subName): QWidget(parent), ui(new Ui::SubWidget)
{ui->setupUi(this);qDebug()<<"subName"<<subName;this->setWindowTitle(subName);initQwt();wTimer = new QTimer();connect(wTimer, SIGNAL(timeout()), this, SLOT(queueToFile()));
}SubWidget::~SubWidget()
{delete ui;
}void SubWidget::initQwt()
{ui->qwtPlot->setFrameStyle(QFrame::Panel);ui->qwtPlot->setLineWidth(0);ui->qwtPlot->setCanvasBackground(QColor(223, 249, 251));ui->qwtPlot->setAxisTitle(QwtPlot::xBottom, "Time");ui->qwtPlot->setAxisTitle(QwtPlot::yLeft, "Temperature");ui->qwtPlot->setAxisScale(QwtPlot::xBottom, 0, 100, 10);ui->qwtPlot->setAxisScale(QwtPlot::yLeft, 0, 80, 10);//放大选中区域QwtPlotZoomer* pZoomer = new QwtPlotZoomer(ui->qwtPlot->canvas());pZoomer->setRubberBandPen(QPen(Qt::lightGray));ui->qwtPlot->replot();for(int i = 0; i < initXData; i++) {xData.append(i);}//画四条线zone1Curve1 = new QwtPlotCurve("Area1");QPen zone1Pen1;zone1Pen1.setColor(QColor(235, 47, 6));zone1Pen1.setWidth(5);zone1Curve1->setPen(zone1Pen1);zone1Curve1->setRenderHint(QwtPlotItem::RenderAntialiased, true);zone1Curve1->attach(ui->qwtPlot);zone1Curve2 = new QwtPlotCurve("Area2");QPen zone1Pen2;zone1Pen2.setColor(QColor(249, 202, 36));zone1Pen2.setWidth(5);zone1Curve2->setPen(zone1Pen2);zone1Curve2->setRenderHint(QwtPlotItem::RenderAntialiased, true);zone1Curve2->attach(ui->qwtPlot);zone1Curve3 = new QwtPlotCurve("Area3");QPen zone1Pen3;zone1Pen3.setColor(QColor(72, 52, 212));zone1Pen3.setWidth(5);zone1Curve3->setPen(zone1Pen3);zone1Curve3->setRenderHint(QwtPlotItem::RenderAntialiased, true);zone1Curve3->attach(ui->qwtPlot);zone1Curve4 = new QwtPlotCurve("Area4");QPen zone1Pen4;zone1Pen4.setColor(QColor(0, 255, 0));zone1Pen4.setWidth(5);zone1Curve4->setPen(zone1Pen4);zone1Curve4->setRenderHint(QwtPlotItem::RenderAntialiased, true);zone1Curve4->attach(ui->qwtPlot);//添加网格grid = new QwtPlotGrid();grid->setMajorPen(QPen(Qt::gray, 0, Qt::DashLine));grid->attach(ui->qwtPlot);QwtLegend* legend = new QwtLegend();legend->setDefaultItemMode(QwtLegendData::Checkable);  //图例可被点击ui->qwtPlot->insertLegend(legend, QwtPlot::TopLegend);// legend->resize(2000, 1000);//点击图例操作connect(legend, SIGNAL(checked(const QVariant&, bool, int)), this, SLOT(showItem(const QVariant&, bool)));// QwtPlotItemList items =  ui->qwtPlot->itemList();// qDebug()<<"items.size"<<items.size();// for(int i = 0; i < items.size(); i++) {//     QwtPlotItem* plotItem  = items.at(i);//     plotItem->setVisible(false);// }
}
/*** @author:xinyuF* @date:2024-03-22* @brief:设置Y轴数据
**/
void SubWidget::setYData(double value, int flag)
{switch(flag) {case 1:yData1.append(value);zone1Curve1->setSamples(xData, yData1);// zone1Curve1->attach(ui->qwtPlot);break;case 2:yData2.append(value);zone1Curve2->setSamples(xData, yData2);// zone1Curve2->attach(ui->qwtPlot);break;case 3:yData3.append(value);zone1Curve3->setSamples(xData, yData3);// zone1Curve3->attach(ui->qwtPlot);break;case 4:yData4.append(value);zone1Curve4->setSamples(xData, yData4);// zone1Curve4->attach(ui->qwtPlot);break;}ui->qwtPlot->replot();
}void SubWidget::setXData(double value)
{xData.append(value);
}uint16_t SubWidget::convertValue(uint8_t high, uint8_t low)
{return (((high << 8) & 0xFF00) | (low & 0xFF));
}void SubWidget::writeFile(QByteArray response)
{QString responseStr = response.toHex(' ');writeFileQueue.enqueue(responseStr);
}void SubWidget::showTemperatureCurve(QByteArray response)
{setXData(initXData++);uint16_t area1V = convertValue(response.at(3), response.at(4));setYData(area1V / 100.0, 1);uint16_t area2V = convertValue(response.at(5), response.at(6));setYData(area2V / 100.0, 2);uint16_t area3V = convertValue(response.at(7), response.at(8));setYData(area3V / 100.0, 3);uint16_t area4V = convertValue(response.at(9), response.at(10));setYData(area4V / 100.0, 4);if(xPosFlag++ > 100) {xPos++;ui->qwtPlot->setAxisScale(QwtPlot::xBottom, xPos, 100 + xPos, 10);}
}void SubWidget::showItem(const QVariant& itemInfo, bool on)
{QwtPlotItem* plotItem = ui->qwtPlot->infoToItem(itemInfo);if(plotItem) {plotItem->setVisible(on);}
}

图示

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/763313.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习pytorch——激活函数损失函数(持续更新)

论生物神经元与神经网络中的神经元联系——为什么使用激活函数&#xff1f; 我们将生物体中的神经元与神经网络中的神经元共同分析。从下图可以看出神经网络中的神经元与生物体中的神经元有很多相似之处&#xff0c;由于只有刺激达到一定的程度人体才可以感受到刺激&#xff0c…

hyperf 二十八 修改器 一

教程&#xff1a;Hyperf 一 修改器和访问器 根据教程&#xff0c;可设置相关函数,如set属性名Attribute()、get属性名Attribute()&#xff0c;设置和获取属性。这在thinkphp中也常见。 修改器&#xff1a;set属性名Attribute()&#xff1b;访问器&#xff1a;get属性名Attri…

从零开始手写RPC框架(番外) Netty基础知识点及常见面试题汇总

目录 Netty 的核心组件Bytebuf(字节容器)Bootstrap 和 ServerBootstrap(启动引导类)Channel(网络操作抽象类)SelectorEventLoop(事件循环)NioEventLoopGroup 默认的构造函数会起多少线程?ChannelHandler(消息处理器) 、 ChannelPipeline(ChannelHandler 对象链表)…

进程控制 | 认识fork函数 | 进程终止 | 进程等待

进程创建 初始fork函数 fork函数是为了创建子进程而生的&#xff0c;通过fork函数之后&#xff0c;我们的父进程的代码和数据是共享的&#xff0c;我们这里是可以通过man手册进行查询的&#xff0c;查询之后是可以发现fork函数是会返回两个值的至于为什么会返回两个值&#x…

牛,The O-one ——通过语音交互控制电脑的开源语言模型

模型介绍 The O-one &#xff1a;一个创新的开源语言模型计算机 可以让你通过语音交互来和你的计算机进行对话&#xff0c;完成询问、指令下达等任务。灵感居然来自Andrej Karpathy 的 LLM 操作系统。O1运行一个代码解释语言模型&#xff0c;并在计算机内核发生特定事件时调用…

社科赛斯考研:二十二载岁月铸辉煌,穿越周期的生命力之源

在考研培训行业的浩瀚海洋中&#xff0c;社科赛斯考研犹如一艘稳健的巨轮&#xff0c;历经二十二载风礼&#xff0c;依然破浪前行。在考研市场竞争白热化与学生对于考研机构要求越来越高的双重影响下&#xff0c;社科赛斯考研却以一种分蘖成长的姿态&#xff0c;扎根、壮大&…

六、C#快速排序算法

简介 快速排序是一种常用的排序算法&#xff0c;它基于分治的思想&#xff0c;通过将一个无序的序列分割成两个子序列&#xff0c;并递归地对子序列进行排序&#xff0c;最终完成整个序列的排序。 其基本思路如下&#xff1a; 选择数组中的一个元素作为基准&#xff08;pivot…

基于python+vue共享单车信息系统的设计与实现flask-django-php-nodejs

课题主要分为二大模块&#xff1a;即管理员模块和用户模块&#xff0c;主要功能包括&#xff1a;用户、区域、共享单车、单车租赁、租赁归还、报修信息、检修信息等&#xff1b;快速发展的社会中&#xff0c;人们的生活水平都在提高&#xff0c;生活节奏也在逐渐加快。为了节省…

实在智能受邀参加中国人工智能产业发展联盟大会(AIIA)主题分享,共筑智能体机遇新篇章

近日&#xff0c;中国人工智能产业发展联盟&#xff08;AIIA&#xff09;在海口召开第十一次全体会议&#xff0c;作为该联盟成员单位&#xff0c;实在智能合伙人&核心算法负责人欧阳小刚受邀出席大会&#xff0c;并以《从RPA到智能体&#xff0c;数字员工的发展及在金融行…

《逆水寒》“公费追星”被骂上热搜,玩家为何如此抗拒剧游联动?

游戏行业最近真是风波不断。 《逆水寒》手游因为和武侠剧《莲花楼》深入联动而遭到玩家抵制&#xff0c;网易游戏测评总监被质疑“公费追星”&#xff0c;还波及到了成毅、陈都灵等多位演员。 尤其是《莲花楼》的男主角成毅&#xff0c;遭到大量《逆水寒》手游玩家的吐槽调侃…

微信向量检索分析一体化数仓探索:OLAP For Embedding

作者&#xff1a;WeOLAP 团队 数据挖掘团队 擅长 OLAP 分析的 ClickHouse 不仅可以用于 vector search&#xff0c;还可承担起整条 embedding 的加工处理工作,All in one Pipeline 也让速度远超传统批处理框架数倍&#xff1b;检索性能虽无法与专业 sim 检索服务相媲美&#xf…

Docker 【安装MongoDB】

文章目录 前言一、安装二、使用三、mongodb常用指令总结 前言 MongoDB是一个非关系型数据库&#xff0c;它主要的应用场景有这些 显示 相比mysql&#xff0c;MongoDB没有事务&#xff0c;索引之类的东西。最小单位是文档。 可能有人说&#xff0c;为什么这个场景我要用mongo…

MO尺度(大气边界层)

在大气表面层( atmospheric surface layer)中,MO参数是用来决定流动是中性或者非中性的一个重要参数。其定义是 z / L z/L z/L&#xff0c;其中 L L L为Obukhov长度&#xff0c;其含义是浮力产生的湍动能和剪切产生的湍动能之比(Hj h AIP 2023)(Monin IAS,1954)&#xff0c;具体…

文件怎么做扫码预览?创建文件活码的步骤有哪些?

现在文件可以通过扫描二维码的方式来获取&#xff0c;与传统的通过聊天软件来传输相比&#xff0c;二维码方式的应用更加的方便&#xff0c;其他人只需要通过扫描一张二维码就可以在手机上浏览或者下载文件&#xff0c;通过手机就可以预览、存储。 文件二维码的制作方法也很简…

“龙腾九洲———孙文佳师生书画作品国际交流展”首展成功举行

应美国纽约罗切斯特大学、美国满煜国际文化艺术交流公司的邀请&#xff0c;“龙腾九洲———孙文佳师生书画作品国际交流展”首展开幕式于2024年1月23日上午12时在美国纽约罗切斯特大学西蒙商学院会展中心举行。 开幕式上&#xff0c;罗切斯特大学负责人Priya和美国满煜文化公司…

第1讲-introduction(4)ALU

ALU(Arithmetic and logic unit) ALU的核心部件是加法器。 算术逻辑单元(Arithmetic Logic Unit,简称 ALU)是中央处理器(CPU)的执行单元,是所有中央处理器的核心组成部分。它负责执行所有的算术和逻辑运算,例如加减乘除、与或非等操作。 ALU的主要功能包括: 1. 执…

重学SpringBoot3-Profiles介绍

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-Profiles介绍 Profiles简介如何在Spring Boot中使用Profiles定义Profiles激活ProfilesIDEA设置active profile使用Profile-specific配置文件 条件化Bean…

Unity-UGUI系统

UGUI是什么 UGUI是Unity引擎内自带的UI系统官方称之为:Unity Ul 是目前Unity商业游戏开发中使用最广泛的UI系统开发解决方案 它是基于Unity游戏对象的UI系统&#xff0c;只能用来做游戏UI功能 不能用于开发Unity编辑器中内置的用户界面 六大基础组件 概述 Canvas EventS…

想做【数据分析师】?需要什么条件?

进入数据时代&#xff0c;数据分析师成为各大企业争先抢夺的主要人才之一。数据分析师是在不同行业中&#xff0c;专门从事行业数据收集、整理、分析并且依据相关的数据做出行业研究、评估和预测的专业人员。那做数据分析师需要满足什么条件呢&#xff1f; 首先我们要看一下数据…

性能测试如何定位分析性能瓶颈?

对于一般公司普通测试工程师来说&#xff0c;可能性能测试做的并不是很复杂&#xff0c;可能只是编写下脚本&#xff0c;做个压测&#xff0c;然后输出报告结果&#xff0c;瓶颈分析和调优的事都丢给开发去做。 在一些大厂都有专门的性能测试团队去定位分析系统性能瓶颈&#…