Russian Qt Forum
Июнь 25, 2018, 11:16 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Конструкторы QQmlApplicationEngine и QSettings портят таймзону (daylight)  (Прочитано 209 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 724



Просмотр профиля WWW
« : Май 20, 2018, 22:20 »

Debian Linux 9 Stable 64 bit, Qt 5.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):

time.pro

Код:
CONFIG+=c++11
CONFIG+=qml_debug
QT+=gui
QT+=core
QT+=quick
QT+=widgets
SOURCES += main.cpp
DEFINES += QT_DEPRECATED_WARNINGS
Записан

Собираю информацию по крупицам
http://webhamster.ru
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Страница сгенерирована за 0.059 секунд. Запросов: 22.