【嵌入式——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/ -lqwtd

INCLUDEPATH += $$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);
    }
}


图示

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JDBC编程】Java连接MySQL的五个步骤

目录 JDBC编程 1.JDBC的使用 2.数据库连接Connection 3.Statement对象 4.ResultSet对象 JDBC编程 JDBC编程运用了MySQL提供的 Java 的驱动包 mysql-connector-java &#xff0c;需要基于 Java 操作 MySQL 即需要该驱动包。同样的&#xff0c; 要基于 Java 操作 Oracle 数据库…

【文本输入框】显示输入文本的字数,并且限制输入字数不能超过***个字符

需求 实现一个输入框显示文本的字数&#xff0c;并且设置字数限制&#xff0c;当文本中没有内容或字符串长度超出限制&#xff0c;则不能点击确定按钮。 <div class"input-content"><div class"pt-2 rounded-tl-xl rounded-tr-xl bg-blue-100"&…

vue3+threejs新手从零开发卡牌游戏(十):创建己方战域

首先在game目录下创建site文件夹&#xff0c;用来存放战域相关代码&#xff1a; 这里思考下如何创建战域&#xff0c;我的想法是添加一个平面&#xff0c;将己方战域和对方战域都添加进这个平面中&#xff0c;所以首先我们先添加一个战域plane&#xff0c;site/index.vue代码如…

C是用什么语言写出来的?

C是用什么语言写出来的? C语言的起源和发展是一个迭代过程&#xff1a; 1. 最初的C语言编译器的开发始于对B语言的改进。B语言是由Ken Thompson设计的&#xff0c;它是基于BCPL语言简化而来的。在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「 C语言的…

2024.3.20 使用maven打包jar文件和保存到本地仓库

2024.3.20 使用maven打包jar文件和保存到本地仓库 使用maven可以很方便地打包jar文件和导入jar文件&#xff0c;同时还可以将该文件保存在本地仓库重复调用。 使用maven打包jar文件和保存到本地仓库 package打包文件。 install导入本地仓库。 使用maven导入jar文件 点击“…

基于GIS、RS、VORS模型、CCDM模型、geodetecto、GWR模型集成的生态系统健康的耦合协调分析技术

集成多源数据&#xff0c;依托ArcGIS Pro和R语言环境&#xff0c;采用“活力-组织力-恢复力-贡献力”&#xff08;VORS&#xff09;模型定量测算生态系统健康指数&#xff08;EHI&#xff09;&#xff1b;如何从经济城镇化&#xff08;GDPD&#xff09;、人口城镇化&#xff08…

【算法杂货铺】分治

目录 &#x1f308;前言&#x1f308; &#x1f4c1; 快速排序 &#x1f4c2;75. 颜色分类 - 力扣&#xff08;LeetCode&#xff09; &#x1f4c2; 912. 排序数组 - 力扣&#xff08;LeetCode&#xff09; &#x1f4c2; 215. 数组中的第K个最大元素 - 力扣&#xff08;Lee…

以RISC-V架构的CLIC中断机制讲解:中断咬尾、中断抢占、中断晚到

1、中断的相关属性 中断所属特权模式&#xff08;M模式 > S模式 > U模式&#xff09;中断等级&#xff1a;决定是否能够抢占当前的中断中断优先级&#xff1a;影响中断的仲裁&#xff0c;优先级高时优先被响应中断编号&#xff1a;区分中断&#xff0c;影响中断的仲裁 …

操作系统面经-什么是操作系统?

通过以下四点可以概括操作系统到底是什么&#xff1a; 操作系统&#xff08;Operating System&#xff0c;简称 OS&#xff09;是管理计算机硬件与软件资源的程序&#xff0c;是计算机的基石。操作系统本质上是一个运行在计算机上的软件程序 &#xff0c;主要用于管理计算机硬…

视频素材库哪家好?我给大家来分享

视频素材库哪家好&#xff1f;这是很多短视频创作者都会遇到的问题。别着急&#xff0c;今天我就来给大家介绍几个视频素材库哪家好的推荐&#xff0c;让你的视频创作更加轻松有趣&#xff01; 视频素材库哪家好的首选当然是蛙学网啦&#xff01;这里有大量的高质量视频素材&am…

成都百洲文化传媒有限公司电商新浪潮的领航者

在当今电商行业风起云涌的时代&#xff0c;成都百洲文化传媒有限公司以其独特的视角和专业的服务&#xff0c;成为了众多商家争相合作的伙伴。今天&#xff0c;就让我们一起走进百洲文化的世界&#xff0c;探索其背后的成功密码。 一、百洲文化的崛起之路 成都百洲文化传媒有限…

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

课题主要分为二大模块&#xff1a;即管理员模块和用户模块&#xff0c;主要功能包括&#xff1a;用户、区域、共享单车、单车租赁、租赁归还、报修信息、检修信息等&#xff1b; 语言&#xff1a;Python 框架&#xff1a;django/flask 软件版本&#xff1a;python3.7.7 数据库…

从内存巷弄到指针大道(一)

文章目录 1.内存和地址1.1理解内存地址酒店大堂&#xff1a;内存的入口房间号&#xff1a;内存地址的意义酒店的楼层划分&#xff1a;内存的结构酒店的房间单位&#xff1a;计算机中的常见单位 1.2如何理解编址 2.指针变量和地址2.1取地址操作符&#xff08;&)2.2 指针变量…

windows系统下python进程管理系统

两年来&#xff0c;我们项目的爬虫代码大部分都是放在公司的windows机器上运行的&#xff0c;原因是服务器太贵&#xff0c;没有那么多资源&#xff0c;而windows主机却有很多用不上。为了合理利用公司资源&#xff0c;降低数据采集成本&#xff0c;我在所以任务机器上使用anac…

力扣热门算法题 59. 螺旋矩阵 II,60. 排列序列,61. 旋转链表

59. 螺旋矩阵 II&#xff0c;60. 排列序列&#xff0c;61. 旋转链表&#xff0c;每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.03.21 可通过leetcode所有测试用例。 目录 59. 螺旋矩阵 II 解题思路 完整代码 Java Python 60. 排列序列 …

Linux基础命令[20]-useradd

文章目录 1. useradd 命令说明2. useradd 命令语法3. useradd 命令示例3.1 不加参数3.2 -d&#xff08;指定家目录&#xff09;3.3 -g&#xff08;指定用户组&#xff09;3.4 -G&#xff08;指定附属组&#xff09;3.5 -p&#xff08;加密密码&#xff09;3.6 -e&#xff08;指…

东方博宜 1449. 求满足条件的数的和

东方博宜 1449. 求满足条件的数的和 这道题我苦想了很久&#xff0c;觉得2个及2个以上很难解决&#xff0c;但是后面发现&#xff0c;可以用一个变量记录次数&#xff0c;次数大于等于2就好了。 #include<iostream> using namespace std; int main() {int n ;cin >…

JetPack之DataBinding基础使用

目录 一、简介二、使用2.1 使用环境2.2 xml文件绑定数据2.3 数据绑定的对象2.3.1 object2.3.2 ObseravbleField2.3.3 ObseravbleCollection 2.4 绑定数据 三、应用场景 一、简介 DataBinding是谷歌15年推出的library,DataBinding支持双向绑定&#xff0c;能大大减少绑定app逻辑…

防火墙在解决方案及典型项目中的应用

防火墙在解决方案及典型项目中的应用 防火墙作为基础安全防护产品&#xff0c;在各种解决方案、业务场景中配套应用&#xff0c;本节给出各类方案资料链接方便查阅。 防火墙在华为网络解决方案中的应用 解决方案 文档 主要应用 CloudFabric云数据中心网解决方案 资料专区…

游戏引擎开发公司 Unity 调查:超六成游戏工作室采纳AI助力开发,效率与质量双提升

Unity是一家专注于游戏引擎开发的公司&#xff0c;其开发的Unity引擎被广泛应用于游戏开发领域&#xff0c;为开发者提供了强大的工具来创建高质量的游戏。Unity引擎不仅支持多种平台&#xff0c;而且具有易用性和灵活性&#xff0c;使得开发者能够高效地进行游戏开发。近年来&…