使用QDateTimeAxis

时间:2018-10-19 14:34:56

标签: c++ qt qt5 qchart

我想使用QChartQLineSeries(其中X值为时间戳)显示实时绘图。当我在X轴上使用QValueAxis时,一切都按预期工作,但是切换到QDateTimeAxis不会导致绘制任何数据-只是一个空图表。

演示该问题的示例代码:

QLineSeries *series = new QLineSeries();
series->setUseOpenGL(true); // Disabling OpenGL doesn't change anything.

QChart *chart = new QChart();
chart->addSeries(series);

QValueAxis *axisY = new QValueAxis();
axisY->setTickCount(5);
axisY->setMinorTickCount(1);
axisY->setLabelFormat("%.2f");

QDateTimeAxis *axisX = new QDateTimeAxis(); // Using QValueAxis here instead makes the problem disappear.
axisX->setTitleText("Timestamp");
axisX->setTickCount(5);

chart->addAxis(axisX, Qt::AlignBottom);
chart->addAxis(axisY, Qt::AlignLeft);
series->attachAxis(axisX);
series->attachAxis(axisY);  

QChartView *chartView = new QChartView(chart);  
chartView->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform | QPainter::HighQualityAntialiasing);

// Add some sample points.
QDateTime xval;
xval.setDate(QDate(2018, 1, 5));
series->append(xval.toMSecsSinceEpoch(), 3);
xval.setDate(QDate(2018, 1, 6));
series->append(xval.toMSecsSinceEpoch(), 6);
xval.setDate(QDate(2018, 1, 7));
series->append(xval.toMSecsSinceEpoch(), 4);

// Set ranges to display.
chart->axisX()->setRange(series->at(0).x(), series->at(series->count()-1).x()); 
chart->axisY()->setRange(0.0, 10.0);

这将导致一个空图表具有默认的X轴值(所有刻度线均为'01 -01-1970 1:00'),但是如果使用QValueAxis而不是{{ 1}}。

我尝试过的事情:

  • QDateTimeAxis-无效;
  • chartView->repaint(),用于在添加数据后重新添加系列;这将导致显示序列,但是X轴刻度值是错误的:它们都显示默认的'01 -01-1970 ...'标签,而不是与数据相对应的标签。即使这是一个可行的解决方案,也不必删除并重新添加该系列。

我正在使用Qt 5.9.2。

chart->removeSeries()/addSeries()为什么表现不同?不管轴的类型如何,有没有办法使它一致地工作?

1 个答案:

答案 0 :(得分:0)

解决方案是在为fromMSecsSinceEpoch()添加的数据设置轴范围时使用toMSecsSinceEpoch()

axisX->setRange(
  QDateTime::fromMSecsSinceEpoch(series->at(0).x()), 
  QDateTime::fromMSecsSinceEpoch(series->at(series->count()-1).x())); 

该系列将正常显示。