Наткнулся на странное поведение конструктора QQmlApplicationEngine. Минимальный код main.cpp:
#include <QApplication>
#include <QQmlApplicationEngine>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
qDebug() << "1ST timezone=" << timezone << " daylight=" << daylight;
tzset();
qDebug() << "2ND timezone=" << timezone << " daylight=" << daylight;
QQmlApplicationEngine engine;
qDebug() << "3ND timezone=" << timezone << " daylight=" << daylight;
return app.exec();
}
Результат работы:
1ST timezone= 0 daylight= 0
2ND timezone= -10800 daylight= 1
3ND timezone= -10800 daylight= 0
То есть, после срабатывания конструктора QQmlApplicationEngine портится daylight.
Я удивился, но работать надо и поэтому попытался обойти это дело так:
long saveTimezone=timezone;
int saveDaylight=daylight;
QQmlApplicationEngine engine;
timezone=saveTimezone;
daylight=saveDaylight;
Сработало, однако в проекте я еще нашел одно место, в котором такое же поведение, после срабатывания конструктора QSettings (но уже в куче). Выглядит так:
qDebug() << "CURRENT timezone=" << timezone << " daylight=" << daylight;
QSettings *config=new QSettings(fileName, QSettings::IniFormat, this);
qDebug() << "CURRENT timezone=" << timezone << " daylight=" << daylight;
CURRENT timezone= -10800 daylight= 1
CURRENT timezone= -10800 daylight= 0
В минимальном коде повторить такое не смог.
Вот. Где еще может слетать daylight я ума не приложу, но вероятности такой не исключаю. Проблема в том, что в моем проекте используется легаси библиотека, которая работает с daylight, и из-за этих проблем выдает неправильное время.
Вопросы: что это за ботва такая, почему некоторые Qt классы портят daylight, как это дело гарантированно обойти?
PS: Файл проекта что б быстро собрать минимальный пример:
time.pro
CONFIG+=c++11
CONFIG+=qml_debug
QT+=gui
QT+=core
QT+=quick
QT+=widgets
SOURCES += main.cpp
DEFINES += QT_DEPRECATED_WARNINGS