显然X轴是日期时间轴的话,那么我们使用的轴类就得是QDateTimeAxis
QChart中日期时间轴的精度是毫秒
因此图表里面的数据的x值需要是一个毫秒数,才能显示出来
---------------------------------------------------------------------------------------------------------------------------------
步骤和画折线图一模一样,只不过使用的轴是日期时间轴QDateTimeAxis
1、创建图表视图
QChartView* view=new QChartView(this);
2、创建图表
QChart* chart=new QChart();
3、将图表设置给图表视图
view->setChart(chart);
4、构建x轴-日期时间轴,设置轴的属性,并将轴添加到图表中
在设置轴的范围时,传入的是2个QDateTime
QDateTimeAxis * axisX = new QDateTimeAxis(this);
axisX -> setTitleText("时间轴"); //设置轴的标题
axisX -> setRange(QDateTime(QDate(2000, 01, 01), QTime(0, 0, 0)),
QDateTime(QDate(2000, 12, 31), QTime(0, 0, 0))); //设置时间轴的范围,参数是两个时期时间QDateTime
axisX -> setTickCount(13); //设置刻度个数
axisX -> setFormat("MM月dd日"); //设置刻度值的格式,和格式化时间字符串一样
axisX -> setLabelsAngle(45);
chart -> addAxis(axisX, Qt::AlignBottom); //添加轴
5、构建y轴-数值轴,设置轴的属性,并将轴添加到图表中
QValueAxis * axisY = new QValueAxis(this);
axisY -> setRange(1000, 2000);
axisY -> setTickCount(11);
axisY -> setTitleText("Y轴");
chart -> addAxis(axisY, Qt::AlignLeft);
6、构建图标里的系列(具体的图),将系列添加到图表中
在追加数据点时,x轴的是需要的是一个毫秒数,才能显示出来
QLineSeries * line = new QLineSeries(this);
line -> setName("时间轴"); //设置图例文本
//要调用毫米精度的这个函数toMSecsSinceEpoch()转成时间戳,否则显示不出来
line -> append(QDateTime(QDate(2000, 01, 01), QTime(0, 0, 0)).toMSecsSinceEpoch(), 1200);
line -> append(QDateTime(QDate(2000, 02, 01), QTime(0, 0, 0)).toMSecsSinceEpoch(), 1400);
line -> append(QDateTime(QDate(2000, 03, 01), QTime(0, 0, 0)).toMSecsSinceEpoch(), 1100);
line -> append(QDateTime(QDate(2000, 04, 01), QTime(0, 0, 0)).toMSecsSinceEpoch(), 1600);
line -> append(QDateTime(QDate(2000, 05, 01), QTime(0, 0, 0)).toMSecsSinceEpoch(), 1300);
chart -> addSeries(line);
7、将轴附加到系列,是点显示在正确的位置上
line->attachAxis(axisX);
line->attachAxis(axisY);
完整代码
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include<QtCharts>
#include<QHBoxLayout>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr) : QWidget(parent)
{
resize(800,600);
QHBoxLayout* h_box=new QHBoxLayout(this);
DrawLineOfTime();
}
~Widget()=default;
//绘制横坐标为时间的折线图
void DrawLineOfTime()
{
//1、创建图表视图
QChartView* view=new QChartView(this);
this->layout()->addWidget(view);
//2.创建图表
QChart* chart=new QChart();
//3.将图表设置给图表视图
view->setChart(chart);
//设置标题
chart->setTitle("时间图");
chart->legend()->show();//显示或者隐藏图例(默认显示)
//4.构建x轴-日期时间轴
QDateTimeAxis* axisX=new QDateTimeAxis(this);
axisX->setTitleText("时间轴");//设置轴的标题
axisX->setRange(QDateTime(QDate(2000,01,01),QTime(0,0,0)),
QDateTime(QDate(2000,12,31),QTime(0,0,0)));//设置时间轴的范围,参数是两个时期时间QDateTime
axisX->setTickCount(13);//设置刻度个数
axisX->setFormat("MM月dd日");//设置刻度值的格式,和格式化时间字符串一样
axisX->setLabelsAngle(45);
chart->addAxis(axisX,Qt::AlignBottom);//添加轴
//5.构建y轴-数值轴
QValueAxis* axisY=new QValueAxis(this);
axisY->setRange(1000,2000);
axisY->setTickCount(11);
axisY->setTitleText("Y轴");
chart->addAxis(axisY,Qt::AlignLeft);
//6.构建折线系列
QLineSeries* line=new QLineSeries(this);
line->setName("时间轴");//设置图例文本
//要调用毫米精度的这个函数toMSecsSinceEpoch()转成时间戳,否则显示不出来
line->append(QDateTime(QDate(2000,01,01),QTime(0,0,0)).toMSecsSinceEpoch(),1200);
line->append(QDateTime(QDate(2000,02,01),QTime(0,0,0)).toMSecsSinceEpoch(),1400);
line->append(QDateTime(QDate(2000,03,01),QTime(0,0,0)).toMSecsSinceEpoch(),1100);
line->append(QDateTime(QDate(2000,04,01),QTime(0,0,0)).toMSecsSinceEpoch(),1600);
line->append(QDateTime(QDate(2000,05,01),QTime(0,0,0)).toMSecsSinceEpoch(),1300);
chart->addSeries(line);
//7、将xy轴附加到折线
line->attachAxis(axisX);
line->attachAxis(axisY);
}
};
#endif // WIDGET_H