使用 QDateTimeAxis 时 QChart 不显示任何系列数据
QChart not displaying any series data when using QDateTimeAxis
我想使用 QChart
和 QLineSeries
显示实时绘图,其中 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
,则相同的代码可以正确呈现系列而不是 QDateTimeAxis
.
我尝试了什么:
chartView->repaint()
- 无效;
chart->removeSeries()/addSeries()
追加数据后重新添加系列;这会导致显示系列,但 X 轴刻度值是错误的:它们都显示默认的“01-01-1970 ...”标签,而不是与数据对应的标签。即使这是一个可行的解决方案,也没有必要删除并重新添加该系列。
我正在使用 Qt 5.9.2。
为什么 QDateTimeAxis
表现不同?无论轴类型如何,有没有办法使这项工作始终如一?
解决办法是在设置坐标轴范围时用fromMSecsSinceEpoch()
加toMSecsSinceEpoch()
的数据:
axisX->setRange(
QDateTime::fromMSecsSinceEpoch(series->at(0).x()),
QDateTime::fromMSecsSinceEpoch(series->at(series->count()-1).x()));
该系列将正常显示。
我想使用 QChart
和 QLineSeries
显示实时绘图,其中 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
,则相同的代码可以正确呈现系列而不是 QDateTimeAxis
.
我尝试了什么:
chartView->repaint()
- 无效;chart->removeSeries()/addSeries()
追加数据后重新添加系列;这会导致显示系列,但 X 轴刻度值是错误的:它们都显示默认的“01-01-1970 ...”标签,而不是与数据对应的标签。即使这是一个可行的解决方案,也没有必要删除并重新添加该系列。
我正在使用 Qt 5.9.2。
为什么 QDateTimeAxis
表现不同?无论轴类型如何,有没有办法使这项工作始终如一?
解决办法是在设置坐标轴范围时用fromMSecsSinceEpoch()
加toMSecsSinceEpoch()
的数据:
axisX->setRange(
QDateTime::fromMSecsSinceEpoch(series->at(0).x()),
QDateTime::fromMSecsSinceEpoch(series->at(series->count()-1).x()));
该系列将正常显示。