Russian Qt Forum

Qt => Вопросы новичков => Тема начата: billy4685 от Январь 06, 2016, 16:43



Название: Как в windows програмно изменить часовый пояс?
Отправлено: billy4685 от Январь 06, 2016, 16:43
Здравствуйте, господа форумчане. Немного уже разобрался с классом QTimeZone. Удалось получить список часовых поясов, подобный тому что в Windows-е, теперь хочу, чтобы в моей проге пользователь мог выбирать из него нужный ему часовой пояс и устанавливать его в систему. Может кто знает как средствами qt изменить часовой пояс в Windows 7(Xp)? Парюсь над этим вопросом уже дня 2, если не больше, пока ничего так и не нашел, разве что средствами WIN API.


Название: Re: Как в windows програмно изменить часовый пояс?
Отправлено: Alex Custov от Январь 06, 2016, 16:48
Средствами Qt никак


Название: Re: Как в windows програмно изменить часовый пояс?
Отправлено: kambala от Январь 07, 2016, 16:48
ну это ж сугубо задача ОС, естественно только winapi


Название: Re: Как в windows програмно изменить часовый пояс?
Отправлено: billy4685 от Январь 09, 2016, 23:39
спасибо за ответ)


Название: Re: Как в windows програмно изменить часовый пояс?
Отправлено: billy4685 от Январь 11, 2016, 12:51
Да уж и в WIN API не нахожу толкового примера((. Вот нашел как можно изменить в системе часовой пояс: https://msdn.microsoft.com/en-us/library/windows/desktop/ms724944%28v=vs.85%29.aspx . Но там в примере к функции SetTimeZoneInformation, они меняют часовой пояс, создав новую структуру типа TIME_ZONE_INFORMATION и установив соответствующие значения для ее полей.

Так же нашел, что в реестре существует список часовых поясов по пути: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones и в каждом часовом поясе есть значение Display - которое как раз и хранит его название. Но вот только не знаю как туда пробраться средствами С++ (для Delphi к примеру нашел вот люди обсуждают: http://www.sql.ru/forum/1139160/kak-vyvesti-spisok-chasovyh-poyasov-iz-sistemy).

Может кто знает как считать этот список часовых поясов с реестра? И как потом установить один из этих часовых поясов для системы?


Название: Re: Как в windows програмно изменить часовый пояс?
Отправлено: kambala от Январь 11, 2016, 19:09
из реестра можно читать даже через QSettings. если хочешь через винапи, то это элементарно гуглится: http://stackoverflow.com/questions/34065/how-to-read-a-value-from-the-windows-registry


Название: Re: Как в windows програмно изменить часовый пояс?
Отправлено: billy4685 от Январь 11, 2016, 22:41
из реестра можно читать даже через QSettings. если хочешь через винапи, то это элементарно гуглится: http://stackoverflow.com/questions/34065/how-to-read-a-value-from-the-windows-registry
Как раз вот сегодня и удалось получить список из реестра с помощью QSettings. Буду теперь дальше разбираться.


Название: Re: Как в windows програмно изменить часовый пояс?
Отправлено: billy4685 от Январь 13, 2016, 11:04
Используя QSettings, и метод SetTimeZoneInformation все же у меня получилось считать часовые пояса, вывести их в QTreeWidget, и потом по выбору из этого списка устанавливать выбранный часовой пояс системе windows.

Пользовался следующими примерами:
https://social.microsoft.com/Forums/en-US/e96b0548-f1b2-45b3-8b33-a40fb00a5cf8/settimezoneinfo-unable-to-read-the-timezone-name-for-the-next-time?forum=Offtopic
https://msdn.microsoft.com/en-us/library/windows/desktop/ms724944%28v=vs.85%29.aspx

Вот только не могу понять как установить имя часового пояса в систему (походу в реестре в ветке: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation - это TimeZoneKeyName). В структуре TIME_ZONE_INFORMATION поля TimeZoneKeyName нет. Решил пользоваться структурой DYNAMIC_TIME_ZONE_INFORMATION там как раз поле TimeZoneKeyName есть в наличии. Но вот почему-то в QtCreator -е на метод SetDynamicTimeZoneInformation - бъет ошибку - 'SetDynamicTimeZoneInformation' was not declared in this scope if(SetDynamicTimeZoneInformation(&tz)) . Хотя саму структуру DYNAMIC_TIME_ZONE_INFORMATION видит, а вот метод SetDynamicTimeZoneInformation почему-то нет.
В чем может быть проблема? Может нужно какую-то библиотеку прописать?


Название: Re: Как в windows програмно изменить часовый пояс?
Отправлено: billy4685 от Январь 13, 2016, 14:20
TimeZoneKeyName все же удалось заполнить, явно используя QSettings через метод setValue("TimeZoneKeyName", str); задал. Но вот в самом Windows 7 название часового пояса так и не появилось(( (на рисунке 1 - вместо него у меня высвечивается что-то типа "Не удается определить текущий часовой пояс... "). Хотя в списке часовой пояс задался (рисунок 2). Как в это поле вписать имя выбранного часового пояса? может кто знает?


Название: Re: Как в windows програмно изменить часовый пояс?
Отправлено: kambala от Январь 14, 2016, 19:35
посмотри в мсдн в какой библиотеке находится SetDynamicTimeZoneInformation() и какой заголовочный файл надо подключать. библиотеку пропишешь через LIBS += -l<имя библиотеки>