以下绘制以时间为横坐标,以随机数为纵坐标的实时动态曲线,此例子是每隔1s更新曲线。
以下是效果图:
1.在UI面板中添加Graphics View,并选择合适位置
2.点击鼠标右键,选择提升为QChart View.
3.在.pro文件中添加以下代码:
QT +=charts
4.h文件内容
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
QT_CHARTS_USE_NAMESPACE
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
int a;
QTimer *timerDrawLine;
void Chart_Init();
void DrawLine();
QChart *chart;
QSplineSeries *lineSeries;
QDateTime curDateTIme = QDateTime::currentDateTime();
};
#endif // MAINWINDOW_H
5..cpp主代码
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
Chart_Init();
timerDrawLine = new QTimer();
timerDrawLine->start(1000);
connect(timerDrawLine,&QTimer::timeout,[=](){
DrawLine();
});
}
6.Chart_Init()的作用是对曲线进行基本设置
void MainWindow::Chart_Init()
{
//初始化QChart
chart = new QChart();
//初始化QSplineSeries
lineSeries = new QSplineSeries();
//设置曲线的名称
lineSeries->setName("随机数测试曲线");
//把曲线添加到QChart的实例chart中
chart->addSeries(lineSeries);
//声明并初始化X轴、两个Y轴
QDateTimeAxis *axisX = new QDateTimeAxis();//x轴为时间轴
QValueAxis *axisY = new QValueAxis();
//设置x坐标轴
axisX->setTitleText("时间(分:秒)");
// 隐藏背景网格X轴框线
axisX->setGridLineVisible(false);
// x轴显示的文字倾斜角度
axisX->setLabelsAngle(0);
// 轴上点的个数
axisX->setTickCount(10);
axisX->setFormat("mm:ss");
//设置y坐标轴上的格点
axisY->setTickCount(10);
axisY->setMin(-5);
axisY->setMax(20);
//设置坐标轴显示的名称
QFont font("Microsoft YaHei",8,QFont::Normal);//微软雅黑。字体大小8
axisX->setTitleFont(font);
axisY->setTitleFont(font);
axisX->setTitleText("X-Test");
axisY->setTitleText("mm:ss");
//设置网格不显示
axisY->setGridLineVisible(false);
//把曲线关联到坐标轴
lineSeries->attachAxis(axisX);
lineSeries->attachAxis(axisY);
//把chart显示到窗口上
ui->graphicsView->setChart(chart);
// 设置渲染:抗锯齿,如果不设置那么曲线就显得不平滑
ui->graphicsView->setRenderHint(QPainter::Antialiasing);
}
7.每隔1s更新坐标,更新的槽函数为DrawLine().
void MainWindow:: DrawLine()
{
// 更新X轴的范围
chart->axisX()->setMin(QDateTime::currentDateTime().addSecs(-1*10));
chart->axisX()->setMax(QDateTime::currentDateTime().addSecs(0));
//在线上添加点
lineSeries->append(QDateTime::currentDateTime().toMSecsSinceEpoch(), rand()%20);
}