Неверные значения в QDateTimeAxis (QtCharts)

Я использую QtCharts для отображения данных моделирования. Моделирование начинается в нулевое время, но моя ось диаграммы всегда начинается с 19 часов. Это смущает меня. Настройка диаграммы проста:

std::vector<SimData> data;

// ... Populate data

auto series = new QLineSeries();

for(auto i : data)
{
  // Append time in milliseconds and a value
  series->append(i.msTime, i.value);
}

this->legend()->hide();

this->addSeries(series);

this->axisX = new QDateTimeAxis;
this->axisX->setTickCount(10);
this->axisX->setFormat("HH:mm:ss");
this->axisX->setTitleText("Sim Time");
this->axisX->setMin(QDateTime());
this->addAxis(this->axisX, Qt::AlignBottom);
series->attachAxis(this->axisX);

this->axisY = new QValueAxis;
this->axisY->setLabelFormat("%i");
this->axisY->setTitleText(x->getID().c_str());
this->addAxis(this->axisY, Qt::AlignLeft);
series->attachAxis(this->axisY);

Если я запускаю без данных, а просто отображаю диаграмму, я получаю это:

QtChart with QDateTimeAxis Если я добавляю данные, начиная с нулевого времени, общий объем данных правильный, но время по-прежнему начинается с 19:00:00. Почему время не начинается с 00:00:00?

QtChart с QDateTimeAxis


person DiB    schedule 26.07.2017    source источник
comment
Попробуйте удалить this->axisX->setMin(QDateTime());   -  person Eligijus Pupeikis    schedule 26.07.2017
comment
Спасибо. Я пытался удалить вызов setMin, но это не дало никакого эффекта. Я добавил его изначально, чтобы попытаться решить проблему, но безрезультатно.   -  person DiB    schedule 26.07.2017


Ответы (3)


Я полагаю, это потому, что вы находитесь на восточном побережье (UTC-5), поэтому, хотя 0 представляет 12:00 (24:00) в UTC-5, 0 мс будет означать 5 часов раньше (19:00 предыдущего дня). У меня была та же проблема, я установил свой часовой пояс на UTC (в Ubuntu), и ось вуаля началась с 0 часов вместо 19.

person amw    schedule 11.10.2017
comment
Я уверен, что вы правы насчет часового пояса. Но непонятно, почему часовой пояс моего компьютера имеет какое-то отношение к данным, которые я рисую. Должен быть программный способ исправить это. (Какой ужасный дефолт.) - person DiB; 12.10.2017

Было подтверждено, что проблема связана со смещением UTC. У SO был хороший пример того, как получить смещение UTC, которое я затем использовал для смещения данных, поступающих в диаграмму:

Простой способ преобразования структура tm (выраженная в формате UTC) в тип time_t

Я создал из этого служебную функцию для использования с данными серии QDateTimeAxis.

double GetUTCOffsetForQDateTimeAxis()
{
  time_t zero = 24 * 60 * 60L;
  struct tm* timeptr;
  int gmtime_hours;

  // get the local time for Jan 2, 1900 00:00 UTC
  timeptr = localtime(&zero);
  gmtime_hours = timeptr->tm_hour;

  // if the local time is the "day before" the UTC, subtract 24 hours
  // from the hours to get the UTC offset
  if(timeptr->tm_mday < 2)
  {
    gmtime_hours -= 24;
  }

  return 24.0 + gmtime_hours;
}

Тогда преобразование данных было простым.

std::vector<SimData> data;

// ... Populate data

auto series = new QLineSeries();

const auto utcOffset = sec2ms(hours2sec(GetUTCOffsetForQDateTimeAxis()));

for(auto i : data)
{
  // Append time in milliseconds and a value
  series->append(i.msTime - utcOffset, i.value);
}

// ...
person DiB    schedule 12.10.2017

Для одинокого скитальца, который, вероятно, окажется здесь.

Мое решение KISS фактически устанавливает время, затем несколько секунд и, наконец, добавляет новую точку данных:

for(int i = 0; i <= points; i++) {
    QDateTime timeStamp;
    timeStamp.setDate(QDate(1980, 1, 1));
    timeStamp.setTime(QTime(0, 0, 0));
    timeStamp = timeStamp.addSecs(i);
    data->append(timeStamp.toMSecsSinceEpoch(), /* your y here */);
}

позже, когда диаграмма будет нарисована, я использовал:

QSplineSeries *temps1 = /* wherever you get your series */;
QChart *chTemp = new QChart();

tempAxisX->setTickCount(5);
tempAxisX->setFormat(QString("hh:mm:ss"));
tempAxisX->setTitleText("Time");
chTemp->addAxis(tempAxisX, Qt::AlignBottom);
temps1->attachAxis(tempAxisX);

Надеюсь, что однажды это поможет будущему посетителю (включая меня).

person Tillo Reilly    schedule 20.08.2018