chart控件做实时曲线显示_「Qt」利用QChart实现实时动态的曲线数据展示(进化版)
本代码实现的功能:
- 实时动态双曲线
- 可以鼠标拖拽
- 可以保留已经产生的数据
- 随着鼠标的移动实时显示X、Y轴坐标
在.pro中
QT += charts
在ChartView.h中
#ifndef __CHARTVIEW_H__
#define __CHARTVIEW_H__
#include
#include
QT_CHARTS_USE_NAMESPACE
class ChartView : public QChartView
{
public:
ChartView(QChart *chart, QWidget *parent = 0);
protected:
void keyPressEvent(QKeyEvent *event);
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
private:
bool isClicking;
int xOld;
int yOld;
QGraphicsSimpleTextItem* m_coordItem;
};
#endif /* __CHARTVIEW_H__ */
在ChartView.cpp中
#include "chartview.h"
ChartView::ChartView(QChart *chart, QWidget *parent) :
QChartView(chart, parent),
isClicking(false),
xOld(0), yOld(0)
{
setRubberBand(QChartView::RectangleRubberBand);
}
void ChartView::mousePressEvent(QMouseEvent *event)
{
if (event->button() & Qt::LeftButton) {
isClicking = true;
} else if (event->button() & Qt::RightButton) {
chart()->zoomReset();
}
QChartView::mousePressEvent(event);
}
void ChartView::mouseMoveEvent(QMouseEvent *event)
{
int x, y;
if (!m_coordItem)
{
m_coordItem = new QGraphicsSimpleTextItem(this->chart());
m_coordItem->setZValue(5);
m_coordItem->setPos(100, 60);
m_coordItem->show();
}
const QPoint curPos = event->pos();
QPointF curVal = this->chart()->mapToValue(QPointF(curPos));
QString coordStr = QString("X = %1, Y = %2").arg(curVal.x()).arg(curVal.y());
m_coordItem->setText(coordStr);
if (isClicking) {
if (xOld == 0 && yOld == 0) {
} else {
x = event->x() - xOld;
y = event->y() - yOld;
chart()->scroll(-x, y);
}
xOld = event->x();
yOld = event->y();
return;
}
QChartView::mouseMoveEvent(event);
}
void ChartView::mouseReleaseEvent(QMouseEvent *event)
{
if (isClicking) {
xOld = yOld = 0;
isClicking = false;
}
/* Disable original right click event */
if (!(event->button() & Qt::RightButton)) {
QChartView::mouseReleaseEvent(event);
}
}
void ChartView::keyPressEvent(QKeyEvent *event)
{
switch (event->key()) {
case Qt::Key_Left:
chart()->scroll(-10, 0);
break;
case Qt::Key_Right:
chart()->scroll(10, 0);
break;
case Qt::Key_Up:
chart()->scroll(0, 10);
break;
case Qt::Key_Down:
chart()->scroll(0, -10);
break;
default:
keyPressEvent(event);
break;
}
}
在MainWindow.h中
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include "qmessagebox.h"
//QChart
#include
using namespace QtCharts;
//定时器
#include
#include "chartview.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void updata_plot();
void on_pushButton_clicked();
void on_pushButton_2_clicked();
private:
//绘图定时器
QTimer *timer_plot;
//曲线
QSplineSeries* line;
QSplineSeries* line1;
//曲线点的最大数量
int line_max = 100;
int a = 1;
int b = 2;
int c = 0;
ChartView *chartView;
//绘图变量和坐标
QChart* chart;
QValueAxis *axisX;
QValueAxis *axisY;
void initchar();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
在MainWindow.cpp中
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//将变量实例化
timer_plot = new QTimer(this);
connect(timer_plot,SIGNAL(timeout()),this,SLOT(updata_plot()));
initchar();
axisX = new QValueAxis(this);
axisY = new QValueAxis(this);
this->setWindowTitle("速度对比");
timer_plot->start(50);
}
//图像更新函数
void MainWindow::updata_plot()
{
QVector list;
QVector newlist;
QVector list1;
QVector newlist1;
list = line->pointsVector();//获取现在图中列表
if (list.size() < line_max)
{
//保持原来
newlist = list;
}
else
{
//错位移动
newlist = list;
c = c + 1;
chart->axisX()->setRange(0+c,100+c);
}
a = a+2;
newlist.append(QPointF(newlist.size(),a));//最后补上新的数据
line->replace(newlist);//替换更新
line->setName("期望速度");//设置曲线名称
line->setPen(QColor(255, 0, 0));//设置曲线颜色
line->setUseOpenGL(true);//openGl 加速
list1 = line1->pointsVector();//获取现在图中列表
if (list1.size() < line_max)
{
//保持原来
newlist1 = list1;
}
else
{
//错位移动
newlist1 = list1;
}
b = b+3;
newlist1.append(QPointF(newlist1.size(),b));//最后补上新的数据
line1->replace(newlist1);//替换更新
line1->setName("当前速度");//设置曲线名称
line1->setPen(QColor(100, 100, 0));//设置曲线颜色
line1->setUseOpenGL(true);//openGl 加速
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
timer_plot->start(50);//启动定时器
}
void MainWindow::on_pushButton_2_clicked()
{
timer_plot->stop();//关闭定时器
}
void MainWindow::initchar()
{
line = new QSplineSeries(this);
chart = new QChart();
chart->addSeries(line);
line1 = new QSplineSeries(this);
chart->addSeries(line1);
chart->removeSeries(line1);
chart->addSeries(line1);
chart->setTitle("速度对比");//设置图标标题
chart->removeSeries(line);
chart->addSeries(line);
chart->createDefaultAxes();//设置坐标轴
chart->axisX()->setRange(0,100);
chart->axisY()->setRange(0,1500);
// chart->legend()->hide();
chartView = new ChartView(chart);
chartView->setRenderHint(QPainter::Antialiasing);
ui->horizontalLayout_2->addWidget(chartView);
}
在MainWindow.ui中
chart控件做实时曲线显示_「Qt」利用QChart实现实时动态的曲线数据展示(进化版)相关推荐
- qchart 坐标轴设置_「Qt」利用QChart实现实时动态的曲线数据展示
根据项目需求,需要在Qt中进行绘图显示我们的数据.这时候,我们就用到了Qt在5.0之后新增的自带QChart控件,不再需要我们自己再去添加第三方库.下面是详细的介绍~ 在.pro文件中 QT += c ...
- chart控件做实时曲线显示_组态王实时趋势曲线控件介绍,让你对此不再陌生
一.组态王实时趋势控件的特点 1. 通过TCPIP获得实时数据,数据服务器可以是任何一台运行组态王的机器,而不需进行组态王网络配置. 2. 最多可以显示20条曲线. 3. 可以设置每条曲线的绘制方式, ...
- chart控件做实时曲线显示_基于GDI+技术开发工业仪表盘控件
写在前面 上次给大家看了一个上位机界面之后,很多人表示对那个仪表盘的开发感兴趣,今天就跟大家分享一下整个的开发过程,由于整个仪表盘开发的过程还是有些复杂的,无法将所有的代码都一一展示,所以重点跟大家分 ...
- chart控件做实时曲线显示_Python 如何实时绘制数据
提到 GUI 绘图,大家可能第一反应是 OpenGL 和 Matplotlib,但其实基于 Qt 平台还有个功能强大的 pyqtgraph 绘图库,不仅支持丰富的图形种类,还能实时更新绘图数据并进行交 ...
- chart控件做实时曲线显示_用PyQt5.QtChart实现动态曲线图
之前一直用爬虫捉取路由实时上下载的记录用数据库保存,有时可用matplotlib来查看时间与上下传的曲线图,但是静态的,查询的时间段需自行认定,虽然qt的日历类可以比较方便取日期按日期查,但总觉要点有 ...
- chart控件做实时曲线显示_Spark+Kafka+WebSocket+eCharts实时分析-完全记录(5)
Kafka环境搭建与测试 Python生产者/消费者测试 Spark接收Kafka消息处理,然后回传到Kafka Flask引入消费者 WebSocket实时显示 版本: spark-2.4.3-bi ...
- python做地图导航_「Python」利用高德地图做你想做之事
玩grasshopper基本上都知道OpenStreetMap 这个地图网站,毕竟有一个好用的地图插件,可以在Rhino中绘制出所需,但是一个不好的地方就在于国内的数据量太少,无法满足我们的需求. 此 ...
- chart控件删除最左边点_常见功能测试点的测试用例大全
登录.添加.删除.查询模块是我们经常遇到的,这些模块的测试点该如何考虑? 1)登录 ① 用户名和密码都符合要求(格式上的要求) ② 用户名和密码都不符合要求(格式上的要求) ③ 用户名符合要求,密码不 ...
- delphi控件切图界面闪烁_「这个控件叫什么」系列之加载占位图+页面指示器
@龙爪槐守望者 :鉴于国内交互设计名词混乱不统一,很多设计师不知道如何用专业术语称呼一个控件,因此我开了<这个控件叫什么>专题,梳理控件的名称和使用事项,希望能为推动交互设计发展,做出一点 ...
最新文章
- IBM发明世界首个人造神经元,人工智能的底层硬件基石已完成!
- 《算法:C语言实现》—— 第二部分 —— 第3章 —— 基本数据结构
- codesys 简单案例_第一章:初识Codesys-1.4从一个示例程序讲起
- CAP定理(CAP theorem)
- spider-抓取网页内容(Beautiful soup)
- 《企业迁云实战》——1.3 云服务的发展现状
- python函数参数值_python 函数参数
- 喜马拉雅音频下载+x2m文件转换
- 新版edge浏览器没有internet选项怎么办?
- matlab设置时间步长,时间步长的设置问题
- 用k-mer分析进行基因组调查:(六)用KmerGenie一步实现
- 未明学院:爬取微博关注列表,带你一窥“饭碗cp”的人际网
- 再Windows下 .Pages格式怎么保存为word或者PDF格式
- acwing 2041.干草堆
- java线程锁死是什么
- LVM逻辑卷管理和挂盘操作
- java课堂作业部分
- 计算机显示器模糊,电脑显示器模糊的原因和解决方法【图文】
- hello,bili
- 实时流媒体视频监控系统——的流媒体客户端——视频解码处理