【嵌入式——QT】QWT应用

news2024/9/22 9:37:20

【嵌入式——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);
    }
}


图示

在这里插入图片描述

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

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

相关文章

【CPP】C++11多线程

thread类 在C11之前&#xff0c;涉及到多线程问题&#xff0c;都是和平台相关的&#xff0c;比如windows和linux下各有自己的接口&#xff0c;这使得代码的可移植性比较差。C11中最重要的特性就是对线程进行支持了&#xff0c;使得C在并行编程时不需要依赖第三方库&#xff0c…

深度学习500问——Chapter04:经典网络解读(1)

文章目录 4.1 LeNet-5 4.1.1 模型介绍 4.1.2 模型结构 4.1.3 模型特性 4.2 AlexNet 4.2.1 模型介绍 4.2.2 模型结构 4.2.3 模型特性 4.3 ZFNet 4.3.1 模型介绍 4.3.2 模型结构 4.3.3 模型特性 4.4 Network in Network 4.4.1 模型介绍 4.4.2 模型结构 4.4.3 模型特性 4.1 LeNet-…

60、服务攻防——中间件安全CVE复现weblogicJenkinsGlassFish

文章目录 weblogicJbossJenkinsGlassFish weblogic 默认端口&#xff1a;7001&#xff0c;历史漏洞&#xff1a;CVE_2017_3506、CVE_2018_2893、CVE_2018_3245、CVE_2020_14882、CVE_2021_2394 Jboss 历史漏洞&#xff1a;CVE-2017-12149、CVE-2017-7504 Jenkins GlassFis…

安卓 Android Activity 生命周期

文章目录 Intro生命周期方法 & 执行顺序结论code Intro 本文提供一个测试类通过打印的方式展示在多个Activity之间互相跳转的时候&#xff0c;各个Activity的生命周期相关方法的执行顺序。 生命周期方法 & 执行顺序结论 下图出自 郭霖 《第一行代码&#xff08;第二…

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

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

微服务高级篇(三):分布式缓存+Redis集群

文章目录 一、单点Redis的问题及解决方案二、Redis持久化2.1 单机安装Redis2.2 RDB持久化2.3 AOF持久化2.4 RDB和AOF对比 三、Redis主从3.1 搭建Redis主从架构3.1.1 集群结构3.1.2 准备实例和配置3.1.3 启动3.1.4 开启主从关系3.1.5 测试 3.2 数据同步3.2.1 全量同步【建立连接…

Windows11企业版安装WSL2和Ubuntu发布版(避坑)

背景 win10企业版升级win11企业版后&#xff0c;安装WSL2&#xff0c;最后安装WSL的Ubuntu发布版&#xff0c;尝试网上各种方法&#xff0c;还是出现文章第三节所写的问题&#xff0c;差点被这问题搞放弃了&#xff0c;全网少有针对这个问题的答案&#xff0c;有也不顶用&…

python-pandas基础学习

可参考&#xff1a; pandas&#xff1a;http://pandas.pydata.org/docs/user_guide/10min.html 一、基础知识 DataFrame 方法&#xff0c;可以将一组数据&#xff08;ndarray、series, map, list, dict 等类型&#xff09;转化为表格型数据 import pandas as pd data {name: …

Python代码规范化

什么是代码规范化&#xff1f; 代码的规范化书写是指按照一定的规范和标准编写代码&#xff0c;使得代码结构清晰、易于阅读和理解。 代码规范化的意义 Python代码规范化的意义在于提高代码可读性、可维护性和可重用性&#xff0c;从而使代码更易于理解、调试和协作&#xff0c…

解锁AI生成模型的无限可能:Stability-AI 带你领略前沿科技

厌倦了千篇一律的图片和视频&#xff1f;想要创作独一无二的艺术作品&#xff1f;Stability-AI 横空出世&#xff0c;为你打开通往 AI 生成模型的大门&#xff0c;带你领略前沿科技的无限可能&#xff01; 神奇的功能&#xff0c;尽在掌握 Stability-AI 拥有众多令人惊叹的功能…

AI基础知识(4)--贝叶斯分类器

1.什么是贝叶斯判定准则&#xff08;Bayes decision rule&#xff09;&#xff1f;什么是贝叶斯最优分类器&#xff08;Bayes optimal classifier&#xff09;&#xff1f; 贝叶斯判定准则&#xff1a;为最小化总体风险&#xff0c;只需在每个样本上选择那个能使条件风险最小的…

js - 练习题

文章目录 FED3&#xff1a;查找两个节点的最近的一个共同父节点FED4&#xff1a;根据包名&#xff0c;在指定空间中创建对象FED5: 数组去重FED6&#xff1a;用 JavaScript 实现斐波那契数列函数,返回第n个斐波那契数。 f(1) 1, f(2) 1 等FED12&#xff1a;字符串统计FED17&am…

联想ThinkSystem服务器主要硬件Windows Server驱动下载说明

故障现象&#xff1a; 不知道如何获取ThinkSystem系列服务器在Windows Server操作系统下的驱动程序&#xff1f; 解决方案&#xff1a; 本文提供ThinkSystem系列服务器安装Windows Server操作系统所需要的驱动程序下载说明。 以下多路机型的Windows Server 2012 R2及2016驱动…

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;指…

【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 数据库…

XML Data – Semi-Structured Data XML 数据 - 半结构化数据

Outline • Structured, Semistructured, and Unstructured Data • XML Hierarchical (Tree) Data Model • Extracting XML Documents from Relational Databases • XML Documents, DTD, and XML Schema • XML Languages 结构化、半结构化和非结构化数据 - XML 层次&#x…

Java最后一块石头的重量 II(力扣Leetcod1049)

最后一块石头的重量 II 力扣原题 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结…

Java学习笔记NO.24

T1.完成理工超市系统的商品类及其子类的定义&#xff0c;实现“浏览商品”及“查看商品详情”功能 &#xff08;1&#xff09;商品类 public class Goods {public String name;public double price;public int count;public String desc;public Goods(String name, double p…

C/C++代码性能优化——编程实践

1. 编程实践 在一些关键的地方&#xff0c;相应的编程技巧能够给性能带来重大提升。 1.1. 参数传递 传递非基本类型时&#xff0c;使用引用或指针&#xff0c;这样可以避免传递过程中发生拷贝。参数根据是否需要返回&#xff0c;相应加上const修饰&#xff0c;代码更安全&am…

matlab实现机器学习svm

一、目的和要求 1.编程实现SVM训练函数和预测函数&#xff1b; 2.绘制线性和非线性边界&#xff1b; 3.编写线性核函数 二、算法 1.线性svm&#xff1a; 分离超平面&#xff1a;wxb0&#xff0c;对于线性可分的数据集来说&#xff0c;这样的超平面有无穷多个&#xff08;…