QDateTimeAxis中的错误值(QtCharts)

时间:2017-07-26 12:04:25

标签: c++ qt qdatetime qtchart

我正在使用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 with QDateTimeAxis

3 个答案:

答案 0 :(得分:1)

我相信这是因为你在东海岸(UTC-5),所以0代表UTC-5的12am(2400)0ms将提前5小时(前一天1900)。我遇到了同样的问题,将我的时区设置为UTC(在ubuntu下), voila 轴在0小时而不是19小时开始。

答案 1 :(得分:0)

确实证实问题是UTC偏移。 SO有一个很好的例子,说明如何获得UTC偏移,然后我用来抵消进入图表的数据:

Easy way to convert a struct tm (expressed in UTC) to time_t type

我从中创建了一个实用程序函数,用于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);
}

// ...

答案 2 :(得分:0)

对于可能在这里结束的寂寞流浪者。

我的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);

希望对以后的访客(包括我自己)有一次帮助。