Qt第二十四天

绘制动态曲线

#ifndef MAINWINDOW_H
#define MAINWINDOW_H


#include <QMainWindow>
#include <QTimer>
#include <QTime>
#include <qwt_plot.h>
#include <qwt_plot_curve.h>
#include <qwt_legend.h>
#include <math.h>
#include <qwt_plot_zoomer.h>
#include <qwt_plot_panner.h>
#include <qwt_plot_magnifier.h>
#include <qwt_plot_grid.h>
#include <qwt_scale_draw.h>
#include <qwt_plot_layout.h>
#include <qwt_plot_canvas.h>
#include <qwt_plot_renderer.h>
#include <qwt_legend.h>
#include <qwt_legend_label.h>
#include <qwt_plot_grid.h>
#include <qwt_plot_histogram.h>
#include <qwt_column_symbol.h>
#include <qwt_series_data.h>
#include <qwt_plot_dict.h>


namespace Ui {
class MainWindow;
}


class MainWindow : public QMainWindow
{
    Q_OBJECT


public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void setupRealtimeDataDemo(QwtPlot *qwtplot);//设置动态图
    QVector<double> xdata;//提供动态数组
    QVector<double> ydata;//提供动态数组
    QTimer updateTimer;//时钟,用于刷新曲线
    QString demoName;//演示标题
    QwtPlotCurve *curve ;//曲线
    double getData(double inteval);//数据获取函数
    double getData1(double inteval);


    QVector<double> xdata2;//提供动态数组
    QVector<double> ydata2;
    QwtPlotCurve *curve2;//曲线2




private:
    Ui::MainWindow *ui;


private slots:
    void updatedataSlot();//更新数据并显示
    void showItem( const QVariant &itemInfo, bool on );
};


#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <qwt_plot_item.h>
#include <qwt_plot_dict.h>






MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setupRealtimeDataDemo(ui->qwtPlot);


}






MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::setupRealtimeDataDemo(QwtPlot *qwtplot)
{




    //初始化xdata,x对应长度为5的坐标,y初始全为0
    for(int i=1;i<5001;i++)//计算曲线数据
    {
        xdata.append(double(i)/1000-5);//xdata添加元素
        xdata2=xdata;
        ydata.append(0);
        ydata2=ydata;
    }


    demoName = "实时数据演示";
    qwtplot->setTitle(demoName);//设置标题
    qwtplot->setCanvasBackground(Qt::gray);//背景灰色
    //    qwtplot->insertLegend(legend1,QwtPlot::RightLegend);//添加图例(标注)


    curve = new QwtPlotCurve();//new一个曲线
    curve->setTitle("肌电信号");//曲线名字
    curve->setPen( Qt::yellow, 1 );//曲线的颜色黄色 宽度1;
    //    curve->setLegendAttribute(curve->LegendShowLine);//指定一个属性如何绘制图例图标,显示图例的标志,这里显示线的颜色。


    curve2 = new QwtPlotCurve();//new一个曲线
    curve2->setTitle("另一个信号");//曲线名字
    curve2->setPen( Qt::green, 1 );//曲线的颜色绿色 宽度1;


    QTime curtime;
    curtime=curtime.currentTime();
    qwtplot->setAxisTitle(QwtPlot::xBottom, " 系统运行时间");//设置轴标题
    qwtplot->setAxisTitle(QwtPlot::yLeft,"肌电图");//设置轴标题
    qwtplot->setAxisScale(QwtPlot::yLeft,-5,5,0);//禁用自动缩放比例尺,为某个坐标轴指定一个修改的比例尺
    qwtplot->setAxisScale(QwtPlot::xBottom,-5,0,0);//禁用自动缩放比例尺,为某个坐标轴指定一个修改的比例尺


    QwtPlotZoomer *zoomer = new QwtPlotZoomer( qwtplot->canvas() );//可变焦距镜头
    zoomer->setRubberBandPen( QColor( Qt::blue ) );
    zoomer->setTrackerPen( QColor( Qt::black ) );
    zoomer->setMousePattern(QwtEventPattern::MouseSelect2,Qt::RightButton, Qt::ControlModifier );
    zoomer->setMousePattern(QwtEventPattern::MouseSelect3,Qt::RightButton );
    QwtPlotMagnifier *magnifier = new QwtPlotMagnifier( qwtplot->canvas() );//使用滚轮放大/缩小                //默认的滑轮及右键缩放功能  图形的整体缩放


    //magnifier->setMouseButton(Qt::LeftButton);     //设置哪个按钮与滑轮为缩放画布  如果不设置(注册掉当前行)按钮默认为滑轮以及右键为缩放


    QwtPlotGrid *grid = new QwtPlotGrid();//new网格线
    grid->enableX( true );//设置X网格线
    grid->enableY( true );
    grid->setMajorPen( Qt::black, 0, Qt::DotLine );//设置网格线性和颜色
    grid->attach(qwtplot);//把曲线附加到QwlPlot上


    connect(&updateTimer,SIGNAL(timeout()),this,SLOT(updatedataSlot()));//信号和槽
    updateTimer.start(0);//设置刷新时间


    QwtLegend *legend = new QwtLegend;
    legend->setDefaultItemMode( QwtLegendData::Checkable );//图例可被点击
    qwtplot->insertLegend( legend, QwtPlot::RightLegend );//图例位置设计


    connect( legend, &QwtLegend::checked,this,&MainWindow::showItem);//点击图例显示曲线




    ui->qwtPlot->replot();
}


void MainWindow::showItem( const QVariant &itemInfo, bool on )//显示曲线
{
    QwtPlotItem *plotItem =ui->qwtPlot->infoToItem( itemInfo );
    if ( plotItem )
        plotItem->setVisible( on );
}
/**
 * @brief getData
 * @param inteval
 * @return
 * 获取一个值  模拟串口接收到的值
 */
double MainWindow::getData(double time){


    double s = qSin( time * M_PI * 2 )*3 ;
    return s;
}
double MainWindow::getData1(double inteval)
{
    double s=qTan(inteval*M_PI*2);
    return s;
}








//用于更新ydata
void MainWindow::updatedataSlot()
{
    static QTime dataTime(QTime::currentTime());
    long int eltime = dataTime.elapsed();
    static int lastpointtime = 0;


    int size = (eltime - lastpointtime);




    if(size>0){//有数据传入
        ydata.erase(ydata.begin(),ydata.begin()+size);//擦除多余的数据
        ydata2.erase(ydata2.begin(),ydata2.begin()+size);//擦除多余的数据
        for(int i=1;i<size+1;i++){
            ydata.append(getData((((double)lastpointtime+i)/1000)));
            ydata2.append(getData1((((double)lastpointtime+i)/1000)));
        }


        lastpointtime = eltime;
    }






    curve->setSamples(xdata,ydata);//设置曲线数据
    curve2->setSamples(xdata2,ydata2);
    curve->attach(ui->qwtPlot);//把曲线附加到QwlPlot上
    curve2->attach(ui->qwtPlot);
    ui->qwtPlot->replot();//刷新qwt




}


#课程服务在线答疑:本课程设有专门的讨论留言区,学习中遇到任何问题,直接给老师留言即可,老师都会及时进行回复。远程协助:如果遇到复杂问题,老师还可进行远程协助,这个一般可不是一两百元的课程就能享受到的。源码分享:为了让大家更好的进行项目实战,老师还将课程中涉及到的所有源码分享给学员,按照视频中的提示进行下载即可。 在优快云分享C++ Qt开发知识已经有6年了,感谢众多博友对我的支持,了解到很多人对Qt的使用还是有些困扰,例如Qt环境搭建,Qt布局的使用,如何使用Qt编写复杂的界面,如何自定义非标控件,Qt如何和Web交互,Qt和后台接口如何交互等;经过这几年的整理,我决定出这套《Qt高级开发视频教程》,带领大家学习Qt高级开发知识,学习如何使用Qt开发企业级别的项目;通过本课程的学习,大家将会达到企业招聘的中高级要求。 为了照顾零基础学员,本课程第一章会介绍Qt环境搭建、QtCreator / VS2019的基本使用方法,Qt整体架构、Qt信号机制,Qt内存管理等知识。即使没有Qt开发的学习经验,也能跟着课程顺利学习。课程核心知识点地图如下:课程每章核心知识点介绍如下:第一章:介绍Qt环境搭建、QtCreator / VS2019的基本使用方法,Qt整体架构、Qt信号机制,Qt内存管理等知识。第二章:了解到很多学员对于Qt界面布局很不熟悉,将会详细介绍Qt设计器布局,以及如何C++代码手写布局,从常见的企业级项目入手,带领大家学会各种布局的实现,例如WPS、腾讯会议、优酷、迅雷等界面的实现;界面布局会了,这是企业项目开发的第一步,还有更重要的无边框窗口,如何设计一个合理的无边框窗口很重要,第三/四章:详细介绍如何实现一个无边框窗口,如何自定义标题栏,如何实现拖拽拉伸;第四章将会介绍如何自定义非标控件,优化Qt界面。第五章:介绍Qt web混合编程,一个商用项目,必然会涉及到web交互,这也是很多Qt开发者的弱项,这一章讲详细介绍C++ Qt web混合开发。第六章:既然是做企业级项目,必然需要和后台交互,http编程也是必要的,将详细介绍http编程,用户注册,登录,后台接口请求等知识;通过第五、六章的学习,将会是你的Qt开发技术更上一层楼。第七章:介绍Qt并发编程,耗时任务处理,进程调用等知识。第八、九章:讲解 Qt 比较重要的知识,图形视图结构,以及MVD模式;通过这两章的学习,大家会对图形视图有更好的了解。第十章:本章是独立章节,主要介绍Qt中一些特殊技巧,项目编译,dpi适配、多语言等知识。第十一章:是我们的企业级项目实战:实现一个视频会议客户端,本项目可以进行多人视频通话,直播,桌面分享等功能,本项目我会从零开始,进行项目搭建,功能调试,bug fixed, 带领大家做一个企业级项目。 希望通过本课程的学习,大家的C++ Qt开发技术能有质的飞越,能找到自己心仪的工作。 课程中如果讲的不对的地方,请大家指出,我及时修正,我也只是一个普通开发者,也不是所有的技术都会,尽我所能,把我所会的教给大家,让我们一起为Qt的发展,尽一份绵薄之力。  下面是本课程一些项目的截图:1 可以滑动的设置界面        2 所有图形的绘制      3 视频播放器         4 高仿youku界面        5 视频会议        相信通过本课程的学习,大家有能力实现绝大部分客户端项目,从此用C++ Qt再也不会有难写的界面。
### QT下载与十学习计划 #### 下载QT资源 用户可以访问官方站点或相关教程链接以获取QT的安装包和文档。对于不同操作系统,如Windows、macOS和Linux,有特定的安装方法[^1]。例如,在Windows上,用户可以通过下载`.exe`文件完成安装;在macOS上,则使用`.dmg`文件;而在Linux系统中,可以选择`.run`文件进行安装。此外,还有详细的安装教程可供参考,例如针对Ubuntu 20.04的Qt6.5.3安装指南[^1]。 #### 十学习计划概览 根据提供的引用内容,以下是一个简化的十QT学习计划: **第一** - 熟悉QT安装过程以及开发环境配置。确保能够成功运行一个简单的“Hello World”程序[^1]。 - 学习基础组件,如按钮和标签的使用[^2]。 **第二** - 深入了解信号与槽机制,并尝试构建一个简单的交互式界面,例如带有按钮点击事件的小型应用程序[^2]。 - 掌握QVariant的基本用法[^2]。 **第三** - 学习如何创建和管理窗口,包括新建、编辑、保存等功能[^3]。 - 实现文本读写操作,熟悉QFile和QTextStream类。 **第四** - 开发一个简易计算器项目,实践布局管理和基本算术运算逻辑[^4]。 **第五** - 设计并实现QQ登录界面,重点在于表单验证和用户输入处理[^4]。 **第六** - 使用QPainter进行基本绘图操作,绘制线条、矩形等图形元素。 **第七** - 探索多线程编程,理解如何安全地在不同线程间传递数据而不影响UI主线程[^4]。 **第八** - 学习动画效果,利用QPropertyAnimation实现移动、缩放和透明度变化等动态效果[^2]。 **第九** - 结合实际案例(如植物大战僵尸魔改版),综合运用前面所学知识完成更复杂的项目[^4]。 **第十** - 如果时间允许,还可以扩展到音视频录制功能的学习,通过alsa库实现录音播放等功能[^5]。 ```python # 示例代码:创建一个简单的窗口应用 from PyQt5.QtWidgets import QApplication, QLabel app = QApplication([]) label = QLabel('Hello Qt!') label.show() app.exec_() ``` #### 注意事项 - 在学习过程中遇到问题时,请查阅官方文档或搜索类似问题的解决方案。 - 对于初学者来说,建议从简单项目开始,逐步增加复杂度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值