QChart не отображает данные ряда при использовании QDateTimeAxis - PullRequest
0 голосов
/ 19 октября 2018

Я хочу отобразить график в реальном времени, используя QChart и QLineSeries, где значения X являются временными метками.Все работает, как и ожидалось, когда я использую QValueAxis для оси X, но переключение на 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 'для всех тиков), но тот же код правильно отображает серию, если вместо QDateTimeAxis используется QValueAxis.

То, что я пробовал:

  • chartView->repaint() - не имеет никакого эффекта;
  • chart->removeSeries()/addSeries() для повторного добавления серии после добавления данных;это приводит к тому, что ряды отображаются, но значения отметок по оси X неверны: все они показывают метки по умолчанию «01 -01-1970 ...», а не те, которые соответствуют данным.Даже если бы это было рабочее решение, нет необходимости удалять и повторно добавлять серии.

Я использую Qt 5.9.2.

Почему QDateTimeAxis ведут себя по-другому?Есть ли способ заставить это работать последовательно независимо от типа оси?

1 Ответ

0 голосов
/ 23 октября 2018

Решение состоит в том, чтобы использовать fromMSecsSinceEpoch() при настройке диапазона оси для данных, добавленных с помощью toMSecsSinceEpoch():

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

. Затем серия будет отображаться нормально.

...