1、首先需要使用Qt charts 需要向工程目录的.pro文件添加这句话
QT += charts
2、接下来是实现的效果图如下
该动态曲线图是实时显示右边温度计的实时温度
3、头文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QDateTime>
#include <QTableWidget>
#include <QMessageBox>
#include <QProcess>
#include <QtCharts>
#include <QPrintDialog>
#include <QPrinter>
#include <QPrintPreviewDialog>
#include <QPageSetupDialog>
#include "my_sql.h"
#pragma execution_character_set("utf-8")
using namespace QtCharts;
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
public slots:
void updateLine();
private slots:
private:
Ui::MainWindow *ui;
QChart *m_chart;
QLineSeries *m_series;
QValueAxis *axisX;
QValueAxis *axisY;
qint16 m_x;
int m_y;
int curSec;
int maxXTickCount;
void initLineChart();
};
4、源文件
#include "mainwindow.h"
#include "ui_mainwindow.h"
extern UseData m_UseInfo;
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QTimer *lineT = new QTimer(this);
initLineChart();
lineT->start(1000);
connect(lineT, SIGNAL(timeout()), this, SLOT(updateLine()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::initLineChart()
{
maxXTickCount = 5;
m_chart = new QChart;
ui->widget_2->setChart(m_chart);
ui->widget_2->setRubberBand(QChartView::HorizontalRubberBand);
ui->widget_2->setRenderHint(QPainter::Antialiasing);
m_series = new QSplineSeries;
m_series->setUseOpenGL(true);
axisX = new QValueAxis;
axisX->setLabelFormat("%g");
curSec = QTime::currentTime().second();
axisX->setTickCount(maxXTickCount);
axisX->setTitleText("axisX");
axisX->setRange(curSec, curSec+maxXTickCount*2);//设置显示范围
axisY = new QValueAxis;
axisY->setRange(-30, 30);
axisY->setTickCount(7);
m_x = curSec;
m_y = -25;
m_series->append(m_x, m_y);
m_chart->createDefaultAxes();
m_chart->addSeries(m_series);
m_chart->setAxisX(axisX, m_series);
m_chart->setAxisY(axisY, m_series);
m_chart->legend()->hide();
m_chart->setTheme(QChart::ChartThemeDark);
}
//温度计实时/历史数据显示
void MainWindow::updateLine()
{
qreal dwidth= m_chart->plotArea().width()/(axisX->tickCount()*2); //一次滚动多少宽度
m_x += 1;
m_y = ui->widget->getValue();
m_series->append(m_x, m_y);
if(m_series->points().count() > 1000)
m_series->remove(0);
if(m_x > curSec+maxXTickCount*1.5)
m_chart->scroll(dwidth, 0); //dwidth 代表的窗口横坐标方向滚动的区域大小
//dwidth 的单位不是横坐标的单位,而是窗口像素
}
其中 ui->widget->getValue() 是实时获取当前温度计控件的温度值 可在我的另一篇博客中 Qt 绘制温度计 找到这个函数
5、另一篇 Qt 绘制温度计控件 博客的链接在这里 Qt 自绘温度计控件