19、QChartView绘图
1、需要在⼯程⽂件.pro⽂件中添加,QT += charts
2、在ui界⾯放置⼀个widget控件,并将其提升为QChartView,继承于QWidget
 如果将⼀个widget提升了QChartView后报错,在ui_mainwindow.h中加⼊
QT_CHARTS_USE_NAMESPACE
3、构造⼀个QChart对象;
QChart* mychart; // 构建图表类
QLineSeries *line; // 构建⼀个折线系列
mychart = new QChart;
line = new QLineSeries(this); // 构建折线对象
// 在折线上添加数据
for(size_t i=0;i<100;i++)
{
line->append(i,4*sin(0.6f*i));  // 在折线上添加点
}
// 将折线添加到图标上
mychart->addSeries(line);
mychart->createDefaultAxes();  // 创建默认的坐标轴
mychart->setTheme(QChart::ChartThemeBlueCerulean);  // 设置背景为绿⾊
mychart->legend()->hide(); // 隐藏图例
ui->widget->setChart(mychart); // 图表绑定在视图上
4、图表添加修饰
/
/ 将折线添加到图标上
mychart->addSeries(line);
mychart->createDefaultAxes();  // 创建默认的坐标轴
mychart->setTheme(QChart::ChartThemeBlueCerulean);  // 设置背景为绿⾊
mychart->legend()->hide(); // 隐藏图例
// 还是出现中⽂乱码?
mychart->setTitle(QString::fromLocal8Bit("图表标题")); // 设置图表标题
ui->widget->setChart(mychart); // 图表绑定在视图上
// 设置反⾛样折线平滑处理
ui->widget->setRenderHint(QPainter::Antialiasing,true);
// 注意在析构的时候,释放曲线
mychart->removeAllSeries();  // ⾃带的析构函数没有释放这块,⾃⼰做析构
5、使⽤QGraphicView绘制图表
QGraphicsScene* Space;  // 构建⼀个场景
在上⾯的基础上进⾏修改
mychart = new QChart;
line = new QLineSeries(this); // 构建折线对象
// 在折线上添加数据
for(size_t i=0;i<100;i++)
{
line->append(i,4*sin(0.6f*i));  // 在折线上添加点
}
// 将折线添加到图标上
mychart->addSeries(line);
mychart->createDefaultAxes();  // 创建默认的坐标轴
mychart->setTheme(QChart::ChartThemeBlueCerulean);  // 设置背景为绿⾊
mychart->legend()->hide(); // 隐藏图例
// 还是出现中⽂乱码?
mychart->setTitle(QString::fromLocal8Bit("图表标题")); // 设置图表标题
mychart->setGeometry(0, 0, 300, 200); // 设置图表尺⼨
//QGraphicsItem--->mychart
Space = new QGraphicsScene(this);  // 构建场景
Space->addItem(mychart);      // 图表添加到视图上
ui->graphicsView->setScene(Space);  // 给场景设置视图
//ui->widget->setChart(mychart); // 图表绑定在视图上
// 设置反⾛样折线平滑处理
//ui->widget->setRenderHint(QPainter::Antialiasing,true);
ui->graphicsView->setRenderHint(QPainter::Antialiasing,true);
View Code
6、绘制动态折线图
// 构建⼀个定时器,移动曲线,更新曲线,定时器超时槽函数
QChart* mychart; // 构建图表类
/
/QLineSeries *line; // 构建⼀个折线系列
QSplineSeries *line;  // 构建⼀个曲线系列
QGraphicsScene* Space;  // 构建⼀个场景
QTimer *timer; // 创建⼀定定时器
QValueAxis* AxisX;  // 图表X坐标轴
QValueAxis* AxisY;  // 图表Y坐标轴
qint64 tmLast; // 上次进⼊定时器的时间
private:
Ui::Widget *ui;
private slots:
void Slot_Timeout();  // 定时器超时函数
View Code
在前⾯的基础上修改代码,构造函数
const quint32 Max_Axis = 300; // 定义X轴坐标范围
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget), tmLast(0) // 构造函数中变量初始化
{
ui->setupUi(this);
mychart = new QChart;
//line = new QLineSeries(this); // 构建折线对象
line = new QSplineSeries(this);
// 在折线上添加数据
for(size_t i=0;i<Max_Axis;i++)
{
line->append(i,4*sin(0.6f*i));  // 在折线上添加点
}
// 将折线添加到图标上
mychart->addSeries(line);
//mychart->createDefaultAxes();  // 创建默认的坐标轴
// 构建⾃⼰的坐标轴
AxisX = new QValueAxis(this);
AxisX->setRange(0, Max_Axis);
AxisX->setTitleText(QString::fromLocal8Bit("X"));
AxisY = new QValueAxis(this);
AxisY->setRange(-4, 4); // 设置坐标轴范围
AxisY->setTitleText(QString::fromLocal8Bit("Y")); // 设置Y轴坐标
// 图表添加坐标轴
mychart->setAxisX(AxisX, line);
mychart->setAxisY(AxisY, line);
mychart->setTheme(QChart::ChartThemeBlueCerulean);  // 设置背景为绿⾊    mychart->legend()->hide(); // 隐藏图例
// 还是出现中⽂乱码?
mychart->setTitle(QString::fromLocal8Bit("图表标题")); // 设置图表标题
mychart->setGeometry(0, 0, 1000, 800); // 设置图表尺⼨
//QGraphicsItem--->mychart
Space = new QGraphicsScene(this);  // 构建场景
Space->addItem(mychart);      // 图表添加到视图上
ui->graphicsView->setScene(Space);  // 给场景设置视图
//ui->widget->setChart(mychart); // 图表绑定在视图上
// 设置反⾛样折线平滑处理
//ui->widget->setRenderHint(QPainter::Antialiasing,true);
ui->graphicsView->setRenderHint(QPainter::Antialiasing,true);
// QTimer
timer = new QTimer(this);
timer->setInterval(100);  // 设置定时器间隔
timer->start();          //启动定时器
// 定时器与槽函数关联
connect(timer,&QTimer::timeout,this,&Widget::Slot_Timeout);
View Code
实现曲线,动态显⽰,定时器超时函数
// 静态数据存储第⼀次进⼊定时器的时间
static QTime tmBegin = QTime::currentTime();  // 当前时间 17:33:12.34
//qDebug() << "tmBegin:"<<tmBegin;  //
// tmEllaspsed: tmBegin从第⼀次定义到现在的时间超时时间的n倍
qint64 tmEllaspsed = tmBegin.elapsed();
// qDebug() << "tmEllaspsed:"<<tmEllaspsed;
// 计算两次进⼊定时器经历的时间差
// 这样获取时间更精确
qint64 nSkip = tmEllaspsed - tmLast;  // 约等于定时器超时时间
//qDebug() << "nSkip:"<< nSkip;
// 获取曲线上的点
QVector<QPointF> ptsOld = line->pointsVector();
QVector<QPointF> ptsNew;    // 新数据
// 曲线上后⾯的数据向前移动
qint64 i=0;
for(i=0;i< unt() - nSkip;i++)
{
ptsNew.append(QPointF(i, ptsOld[i+ nSkip].y()));
}
// 补充新数据
for(i = unt() - nSkip;i < unt();i++)
{
ptsNew.append(QPointF(i,4*sin(0.6f*i)));
}
// 更新数据
line->replace(ptsNew);
/
/ 更新上次进⼊定时器的时间
tmLast = tmEllaspsed;  //取现在的时间
View Code
7、设置坐标轴的分辨率
AxisX->setTickCount(5); // 横坐标被5等分刻度显⽰
8、上⾯刷新的曲线,但是坐标轴不动;类似⼼电图的曲线动,坐标轴也在刷新
ui->setupUi(this);
mychart = new QChart;
//line = new QLineSeries(this); // 构建折线对象
line = new QSplineSeries(this);
/
/ 在折线上添加初始化数据,第⼀个点
m_x = 0.f;  // 表⽰第⼀个点的横坐标
m_x= 300;  // 第⼀个点的初始化横坐标在8的位置上
// 曲线上添加第⼀个点,第⼀个点的位置决定曲线终点的位置
line->append(m_x, 1);
// 将折线添加到图标上
mychart->addSeries(line);
//mychart->createDefaultAxes();  // 创建默认的坐标轴
// 构建⾃⼰的坐标轴
AxisX = new QValueAxis(this);
AxisX->setRange(0, Max_Axis);
AxisX->setTitleText(QString::fromLocal8Bit("X"));
AxisX->setLabelFormat("%g");    // 去掉多余的0
AxisX->setTickCount(5); // 横坐标被分割5份显⽰
AxisY = new QValueAxis(this);
AxisY->setRange(-4, 4); // 设置坐标轴范围
AxisY->setTitleText(QString::fromLocal8Bit("Y")); // 设置Y轴坐标
// 图表添加坐标轴
mychart->setAxisX(AxisX, line);
mychart->setAxisY(AxisY, line);
mychart->setTheme(QChart::ChartThemeBlueCerulean);  // 设置背景为绿⾊asp查看源码配置ui
mychart->legend()->hide(); // 隐藏图例
/
/ 还是出现中⽂乱码?
mychart->setTitle(QString::fromLocal8Bit("图表标题")); // 设置图表标题
mychart->setGeometry(0, 0, 800,  600); // 设置图表尺⼨
//QGraphicsItem--->mychart
Space = new QGraphicsScene(this);  // 构建场景
Space->addItem(mychart);      // 图表添加到视图上
ui->graphicsView->setScene(Space);  // 给场景设置视图
//ui->widget->setChart(mychart); // 图表绑定在视图上
// 设置反⾛样折线平滑处理
//ui->widget->setRenderHint(QPainter::Antialiasing,true);
ui->graphicsView->setRenderHint(QPainter::Antialiasing,true);
/
/ QTimer
timer = new QTimer(this);
timer->setInterval(200);  // 设置定时器间隔
timer->start();          //启动定时器
// 定时器与槽函数关联
connect(timer,&QTimer::timeout,this,&Widget::Slot_Timeout);
View Code
qreal xOffset = 0.f;  // 定义⼀个数据偏移量
qreal dIncrease = 0.5;  // 每个数据的x轴增加1
for(int i=0;i<10;i++)
{
m_x += dIncrease;
xOffset += dIncrease;
line->append(m_x, qrand()%4);
}
if(line->count()*dIncrease > 500)
{
line->removePoints(0,line->count() - 500);
}
// 单位x轴上长度
qreal xUnit = mychart->plotArea().width()/(AxisX->max()-AxisX->min());    qreal xScrell = xUnit * xOffset; // 需要滚动的值
mychart->scroll(xScrell, 0); // 取得是变化量
View Code

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。