QtCharts模块勾画折线和曲线图
QtCharts画线图主要三个部分组成 QLIneSeries或QSplineSeries用于保存联系的坐标位置数据,QChart用于管理图像显示,例如图例,坐标主题等,QChartView则用于显示。
上代码
#ifndef WIDGET_H
#define WIDGET_H
#define SPLINE #include <QWidget>
#include <QList>
#include <QTimerEvent>
#include <QtCharts/QLineSeries>
#include <QtCharts/QSplineSeries>
#include <QtCharts/QChart>
#include <QtCharts/QChartView>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE class Widget : public QWidget
{
Q_OBJECT public:
Widget(QWidget *parent = nullptr);
~Widget(); protected:
void timerEvent(QTimerEvent *event);
private:
void dataRefresh(QList<float> *t);
Ui::Widget *ui;
int _timerid;
int _x = 20;
int _y = 80;
int _lineNumber = 10;
QList<QList<float >*> *_data;
#ifndef SPLINE
QList<QtCharts::QLineSeries*> *_lines;
#else
QList<QtCharts::QSplineSeries*> *_splines;
#endif
QtCharts::QChart * _chart;
QtCharts::QChartView * _chartView;
int count = 0;
};
#endif // WIDGET_H
下面是cpp
#include "widget.h"
#include "./ui_widget.h"
#include <QDateTime>
#include <QtWidgets/QHBoxLayout>
#include <QtCharts/QValueAxis>
#include <QDebug> Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
_data = new QList<QList<float >*>();
#ifndef SPLINE
_lines = new QList<QtCharts::QLineSeries*>();
#else
_splines = new QList<QtCharts::QSplineSeries*>();
#endif
_chart = new QtCharts::QChart();
for(int i = 0; i< _lineNumber; i++)
{
#ifndef SPLINE
QtCharts::QLineSeries *s = new QtCharts::QLineSeries();
connect(s, &QtCharts::QLineSeries::clicked,[](const QPointF& pointF){qDebug()<< pointF;});
_lines->push_back(s);
#else
QtCharts::QSplineSeries *s = new QtCharts::QSplineSeries();
connect(s, &QtCharts::QSplineSeries::clicked,[](const QPointF& pointF){qDebug()<<pointF;});
_splines->push_back(s);
#endif s->setPointLabelsClipping(false);
s->setPointLabelsVisible(true);
s->setPointsVisible(true);
s->setPointLabelsFormat(QStringLiteral("(@xPoint,@yPoint)"));
s->setName(QString::fromStdString("温度")+QString::number(i));
//文档说明使用OpenGL加速可以更快的的勾画并且支持更多的点,但是会缺乏一些显示功能相对与CPU渲染
// s->setUseOpenGL(true);
qDebug()<<"OpenGL:"<<s->useOpenGL();
_chart->addSeries(s);
}
_chart->setTitle(QString("曲线图"));
QtCharts::QValueAxis *x = new QtCharts::QValueAxis();
x->setRange(0, _x);
x->setTitleText(QString::fromStdString("min"));
x->setTickCount(30);
QtCharts::QValueAxis *y = new QtCharts::QValueAxis();
y->setRange(0, _y);
y->setTitleText(QString::fromStdString("摄氏度"));
y->setTickCount(20);
_chart->addAxis(x,Qt::AlignBottom);
_chart->addAxis(y,Qt::AlignLeft);
for(int i = 0; i< _lineNumber; i++){
#ifndef SPLINE
(*_lines)[i]->attachAxis(x);
(*_lines)[i]->attachAxis(y);
#else
(*_splines)[i]->attachAxis(x);
(*_splines)[i]->attachAxis(y);
#endif
} _chart->legend()->show();
// _chart->createDefaultAxes();
_chartView = new QtCharts::QChartView(_chart);
_chartView->setRenderHint(QPainter::Antialiasing);
// _chartView->setRubberBand(QtCharts::QChartView::RectangleRubberBand);
QHBoxLayout *h_layout = new QHBoxLayout();
h_layout->addWidget(_chartView);
setLayout(h_layout);
_timerid = startTimer(1000);
qsrand(QDateTime::currentDateTime().toTime_t()); } Widget::~Widget()
{
delete ui;
}
void Widget::timerEvent(QTimerEvent *event) {
if(event->timerId() == _timerid)
{
QList<float > *v_list = new QList<float >();
for (int i = 0; i < _lineNumber; i++) {
float v = qrand() % _y;
v_list->push_back(v);
}
dataRefresh(v_list);
}
} void Widget::dataRefresh(QList<float> *t) {
if(_data->length() >= _x)
{
_data->clear();
#ifndef SPLINE
for(int i=0; i < _lines->length();i++)
{
(*_lines)[i]->clear();
}
#else
for (int i = 0; i < _splines->length(); ++i) {
(*_splines)[i]->clear();
}
#endif
}
_data->push_back(t);
for (int i = 0; i < _lineNumber; ++i) {
qDebug()<<_data->length()-1<<(*_data->last())[i];
#ifndef SPLINE
(*_lines)[i]->append((_data->length()-1),(*_data->last())[i]);
#else
(*_splines)[i]->append((_data->length()-1), (*_data->last())[i]);
#endif
}
qDebug()<< ++count; }
本人是在ubuntu18.04平台 Qt版本5.12.6下进行的测试,用cmake进行的组织,使用了一个SPLINE宏进行了两个折线和曲线的切换。测试时发现series使用OpenGl渲染出现明显锯齿并且无法显示坐标点图标,所以本模所有功能块未对GPU渲染提供完全支持,官方文档也提供了提示。

如过要使用OpenGL加速有较多的限制,只有自己权衡了。
QtCharts模块勾画折线和曲线图的更多相关文章
- QtCharts模块在QtWideget中图表绘制(非QML)
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QtCharts模块在QtWideget中图表绘制(非QML) 本文地址:http:/ ...
- qml: QtCharts模块的使用(基本配置)------<一>
QtCharts模块可以用于绘制图表: 导入模块: import QtCharts 2.2 例子: import QtQuick 2.0 import QtCharts 2.2 ChartView { ...
- qml: QtCharts模块得使用(数据整合和显示) ---- <二>
QtCharts目前已经可以免费使用,而且使用非常方便.快捷,并且提供了各种类别的支持(例如:曲线图,柱形图,折线图,饼图等). 这里讲解qml端图表显示,C++端进行数据整合,并能实现实时数据刷新( ...
- python的turtle模块画折线图
代码如下: import turtle yValues = [10.0,7.4,6.4,5.3,4.4,3.7,2.6] def main(): t = turtle.Turtle() t.hidet ...
- 47.QT-QChart之曲线图,饼状图,条形图使用
1.使用准备 在pro中, 添加QT+= charts 然后在界面头文件中添加头文件并声明命名空间,添加: #include <QtCharts> QT_CHARTS_USE_NAMES ...
- Android实现天气预报温度/气温折线趋势图
Android实现天气预报温度/气温折线趋势图 天气预报的APP应用中,难免会遇到绘制天气温度/气温,等关于数据趋势的折线或者曲线图,这类关于气温/温度的折线图,通常会有两条线.一条是高温线,一 ...
- Python中好用的模块们
目录 Python中好用的模块们 datetime模块 subprocess模块 matplotlib折线图 importlib模块 Python中好用的模块们 datetime模块 相信我们都使 ...
- JHChart iOS图表工具库1.0.3新版本详解
前言. 从2016年4月14日开始,本人着手开发了JHChart图表工具库.经过断断续续的开发,截止到现在,已经实现了折线图.柱状图.饼状图.环形图和表格样式的图表功能.为了方便使用,我已经将一个简单 ...
- 基于ssh框架的highcharts前后台数据交互实例
Highcharts 是一个用纯JavaScript编写的一个图表库, 能够很简单便捷的在web网站或是web应用程序添加有交互性的图表,并且免费提供给个人学习.个人网站和非商业用途使用.HighCh ...
随机推荐
- Windows下pip换成清华源
1.在C:\Users\用户名\ 下创建 pip 文件夹2.在文件夹内创建pip.ini 文件, 添加如下内容: [global] timeout = 6000 index-url = https:/ ...
- Flask框架:运用Ajax轮询动态绘图
Ajax是异步JavaScript和XML可用于前后端交互,在之前<Flask 框架:运用Ajax实现数据交互>简单实现了前后端交互,本章将通过Ajax轮询获取后端的数据,前台使用echa ...
- Golang 实现时间戳和时间的转化
何为时间戳: 时间戳是使用数字签名技术产生的数据,签名的对象包括了原始文件信息.签名参数.签名时间等信息.时间戳系统用来产生和管理时间戳,对签名对象进行数字签名产生时间戳,以证明原始文件在签名时间之前 ...
- 解决头部使用 position:fixed; 固定定位后遮住下方内容的问题
1.在头部下面给一个空的 div 给这个div设置高度,把页面撑开,这种方法是让头部刚好遮住的是这个空div,把内容放出来. 但是这种方法需要一点点调试高度,所以不推荐. 2.把整个要使用 posit ...
- mysql忽略大小写配置
#更改配置文件:vim /etc/my.cnf#添加此行在[mysqld]下lower_case_table_names=1#重启服务systemctl restart mysqld
- 【Java SE进阶】Day08 File类、递归
一.File类 1.概述java.io.File 文件和路径的抽象表示 用于文件和目录的创建.查找和删除等 分类 file--文件 directory--文件夹/目录 path--路径 2.静态成员变 ...
- pycharm全局搜索
方法有:1.使用[Ctrl+N]快捷键按文件名搜索py文件: 2.使用[Ctrl+shift+N]快捷键按文件名搜索所有类型的文件: 3.使用[ctrl+shift+f]快捷全局字符串搜索: 3.使用 ...
- java逻辑运算&&与&的区别
本文主要阐述&&(短路与)和&(逻辑与)的运算异同:a && b 和 a&b : 共同之处是只有a和b同时为真时,结果才为真,否则为假 不同点在于 a ...
- 编译安装nmon
nmon 是什么? nmon(Nigel's performance Monitor for Linux)是一种Linux性能监视工具,当前它支持 Power/x86/x86_64/Mainframe ...
- m3u8文件后缀jpg,png等处理方法及视频合并
处理 # 解析伪装成png的ts def resolve_ts(src_path, dst_path): ''' 如果m3u8返回的ts文件地址为 https://p1.eckwai.com/ufil ...