热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

qt折线图显示数据

                    前面也写了一个关于折线的,可是那个太…,暑假没事在家又弄了一个,希望它

                     前面也写了一个关于折线的,可是那个太…,暑假没事在家又弄了一个,希望它能够有一点可适应性和扩展性。

                    

                    下面是代码实现

     

/*************************************************
折线图绘制
author 周翔
2012-8-14
*************************************************/
#ifndef LINEGRAPHWIDGET_H
#define LINEGRAPHWIDGET_H
#include
#include
#include
#include
//#include
#include
struct point
{
int x;
int y;
};
class LineGraphWidget : public QWidget
{
Q_OBJECT
public:
//mix和max为折线的y轴的数据范围
explicit LineGraphWidget(int mix, int max,QWidget *parent = 0);
void setSingleUnitX(const int &value) {singleUnitX = value;}//设置x轴的一个单位占多少个像素,默认10
//支持定时器定时更新
void startUpdataTimer(int msecond);
void stopUpdataTimer();
signals:
//支持实时更新
void newDataCome();//有新数据到来时发出的折线图更新信号
public slots:
void showData(const int &data);//接受来之外部的数据
protected:
void paintEvent(QPaintEvent *);
void resizeEvent(QResizeEvent *e);
private:
QList xList;
QList yList;
int Counter;
//窗口的长和宽
int widgetX;
int widgetY;
//折线图的显示范围
int rangeMin;
int rangeMax;
//根据窗口和范围得出的单位长,x轴,y轴
int singleUnitX;
int singleUnitY;
//根据窗口得出的多少个单位,x轴,y轴
int sumUnitX;
int sumUnitY;
point basePoint;//折线图的原点
point xAxisEndPoint;//X轴的终点
point yAxisEndPoint;//Y轴的终点
QTimer *timer;
void getSumUnitX();
void getSingleUnitY();
void initGraph();
};
#endif // LINEGRAPHWIDGET_H
#include "linegraphwidget.h"
LineGraphWidget::LineGraphWidget(int mix, int max, QWidget *parent) :
QWidget(parent),
rangeMin(mix),
rangeMax(max),
singleUnitX(10),
timer(NULL)
{
connect(this,SIGNAL(newDataCome()),this,SLOT(update()));
}
void LineGraphWidget::paintEvent(QPaintEvent *)
{
int i;
int a,b,c,d;
Counter = 0;
QPixmap pix(widgetX,widgetY);
QPainter painter(&pix);
pix.fill(Qt::white);
QPen pen;
pen.setBrush(Qt::darkGreen);
painter.setPen(pen);
QPen pen1;
pen1.setBrush(Qt::black);
painter.setRenderHint(QPainter::Antialiasing);
for(i = 0;i a = basePoint.x + i*singleUnitX;
b = basePoint.y;
c= a;
d = yAxisEndPoint.y;
painter.drawLine(a,b,c,d);
}
for(i = 0; i a = basePoint.x;
b = basePoint.y - singleUnitY*i;
c = xAxisEndPoint.x;
d = b;
painter.drawLine(a,b,c,d);
}
painter.setPen(pen1);
for (i = 0;i <(sumUnitY/2+1);++i) {
QRectF rectF(0,basePoint.y - singleUnitY*i*2 - 5,basePoint.x,(widgetY - basePoint.y)/3);
painter.drawText(rectF,Qt::AlignCenter,QString::number(rangeMin+i*20));
}
for (i = 0;i QRectF rectF(basePoint.x+singleUnitX*(5*i+3),basePoint.y,singleUnitX*4,widgetY-basePoint.y);
painter.drawText(rectF,Qt::AlignCenter,QString::number(5*(i+1)*singleUnitX));
}
int size = xList.size();
while(Counter <(size -1)) {
painter.drawLine(basePoint.x + xList.value(Counter)*singleUnitX,
basePoint.y - ((yList.value(Counter) - rangeMin)/10.0)*singleUnitY,
basePoint.x + xList.value(Counter + 1)*singleUnitX,
basePoint.y - ((yList.value(Counter + 1) - rangeMin)/10.0)*singleUnitY);
Counter++;
}
painter.end();
painter.begin(this);
painter.drawPixmap(0,0,pix);
painter.end();
Counter = 0;
}
void LineGraphWidget::resizeEvent(QResizeEvent * e)
{
if (e->oldSize() != size()) {
initGraph();
}
}
void LineGraphWidget::showData(const int &data)
{
//这里还要进行相关的数据正确性检测,不能超过图的范围
if (data > rangeMax || data return;
}
int xsize = xList.size();
int yValue = data;
if (xsize == sumUnitX) {
xList.clear();
yList.clear();
xsize = xList.length();
}
if (xsize >= 1) {
xList.insert(xsize,xsize);
yList.insert(xsize,yValue);
emit newDataCome();
}
else {
xList.insert(xsize,xsize);
yList.insert(xsize,yValue);
}
}
void LineGraphWidget::getSumUnitX()
{
if ((static_cast(widgetX*0.85))%singleUnitX == 0){
sumUnitX = (static_cast(widgetX*0.85))/singleUnitX;
}
else {
sumUnitX = (static_cast(widgetX*0.85))/singleUnitX + 1;
}
}
void LineGraphWidget::getSingleUnitY()
{
int range = rangeMax - rangeMin;
if (range == 0) {
sumUnitY = range/10 + 1;
}
else {
sumUnitY = range/10 + 2;
}
singleUnitY = (static_cast(widgetY*0.85))/sumUnitY;
}
void LineGraphWidget::initGraph()
{
widgetX = size().width();
widgetY = size().height();
basePoint.x = static_cast(widgetX*0.1);
basePoint.y = static_cast(widgetY*0.9);
yAxisEndPoint.x = basePoint.x;
yAxisEndPoint.y = static_cast(widgetY*0.05);
xAxisEndPoint.x = static_cast(widgetX*0.95);
xAxisEndPoint.y = basePoint.y;
getSumUnitX();
getSingleUnitY();
}
void LineGraphWidget::startUpdataTimer(int msecond)
{
if (timer != NULL) {
if (timer->isActive()) {
timer->stop();
}
delete timer;
}
disconnect(SIGNAL(newDataCome()));
timer = new QTimer;
connect(timer,SIGNAL(timeout()),this,SLOT(update()));
timer->start(msecond);
}
void LineGraphWidget::stopUpdataTimer()
{
if (timer == NULL) {
}
else {
timer->stop();
delete timer;
}
}

这篇博客还是去年暑假写的,下面几位仁兄,纠结与main函数怎么写,我很是&#8230;.,我认为这不是问题。

《qt折线图显示数据》

还是我把代码注释一下吧

/*************************************************
折线图绘制
author 周翔
2012-8-14
对外提供接口
void showData(int data);接受外部的折线数据
void setSingleUnitX(const int &value);设置x轴的单位像素
void startUpdataTimer(int msecond);定时器更新折线图
void stopUpdataTimer();关闭定时器
*************************************************/
#ifndef LINEGRAPHWIDGET_H
#define LINEGRAPHWIDGET_H
#include
#include
#include
#include
//#include
#include
struct point
{
int x;
int y;
};
class LineGraphWidget : public QWidget
{
Q_OBJECT
public:
//mix和max为折线的y轴的数据范围
explicit LineGraphWidget(int min, int max, QWidget *parent = 0);
void setSingleUnitX(const int &value) {singleUnitX = value;}//设置x轴的一个单位占多少个像素,默认10
//支持定时器定时更新
void startUpdataTimer(int msecond);
void stopUpdataTimer();
signals:
//支持实时更新
void newDataCome();//有新数据到来时发出的折线图更新信号
public slots:
/**
* @brief showData
* @param adress 地址
* @param _data 数据
*/
void showData(const QString& adress,int _data);//接受来之外部的数据
/**
* @brief slt_showData 接受外部数据
* @param name 设备名
* @param _data 数据
*/
void slt_showData(ushort name,int _data);
protected:
void paintEvent(QPaintEvent *);
void resizeEvent(QResizeEvent *e);
private:
QString m_currentNodeAdress;//当前显示的节点的地址
ushort m_currentNodeName;//当前节点的设备名
QList xList;
QList yList;
int Counter;
//窗口的长和宽
int widgetX;
int widgetY;
//折线图的显示范围
int rangeMin;
int rangeMax;
//根据窗口和范围得出的单位长,x轴,y轴
int singleUnitX;
int singleUnitY;
//根据窗口得出的多少个单位,x轴,y轴
int sumUnitX;
int sumUnitY;
point basePoint;//折线图的原点
point xAxisEndPoint;//X轴的终点
point yAxisEndPoint;//Y轴的终点
QTimer *timer;
void getSumUnitX();
void getSingleUnitY();
void initGraph();
void flush();//数据传入的节点不是现在的当前的节点的时候,刷新画面,清除所有的值
};
#endif // LINEGRAPHWIDGET_H


推荐阅读
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • Day2列表、字典、集合操作详解
    本文详细介绍了列表、字典、集合的操作方法,包括定义列表、访问列表元素、字符串操作、字典操作、集合操作、文件操作、字符编码与转码等内容。内容详实,适合初学者参考。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
  • 006_Redis的List数据类型
    1.List类型是一个链表结构的集合,主要功能有push,pop,获取元素等。List类型是一个双端链表的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除元素,List的设 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
author-avatar
静静敲代码
很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有