Конструкторы QQmlApplicationEngine и QSettings портят таймзону (daylight). Что с этим делать и как обойти?



  • Linux Debian Stable, Qt5.10.1 с официального сайта.

    Наткнулся на странное поведение конструктора 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: Файл проекта что б быстро собрать минимальный пример (потребуется только файл проекта и main.cpp):

    time.pro

    CONFIG+=c++11
    CONFIG+=qml_debug
    QT+=gui
    QT+=core
    QT+=quick
    QT+=widgets
    SOURCES += main.cpp
    DEFINES += QT_DEPRECATED_WARNINGS


Log in to reply