Определить темный стиль/тему приложения используемого в данный момент рабочего стола в QtC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Определить темный стиль/тему приложения используемого в данный момент рабочего стола в Qt

Сообщение Anonymous »

В нашем приложении C++ на базе Qt я пытаюсь автоматически переключать стили приложения в зависимости от того, настроил ли пользователь темную или яркую тему.
Я разобрался с уведомлением о том, когда происходит изменение (см. ниже, для справки для других).
Моя основная проблема — надежное определение того, используется ли в настоящее время темная или яркая тема в Linux (для окон см. ниже); в XFCE проверка цветовых ролей QPalette, упомянутая в этом ответе, работает, но у меня она не работает в Gnome и KDE Plasma (проверено как в Ubuntu 22.04, так и в Fedora 36, ​​мое приложение создано на основе Qt версий 6.5beta2 и 6.4.2 соответственно); там цвета по-прежнему кажутся взятыми из того, что я установил в качестве темы XFCE на том же компьютере (и при запуске настроек xfce4-appearance-settings и изменении там темы мое приложение улавливает изменения). Однако я хотел бы адаптироваться к настройке темного режима текущего рабочего стола.
Итак, мой вопрос: как мне надежно определить темный режим приложения используемого в данный момент рабочего стола в Qt? Я не против реализации небольшого кода, специфичного для платформы, если ничего не доступно непосредственно в Qt, но было бы здорово, если бы он работал без использования дополнительных библиотек.
Примечание, которое я видел для QApplication::setPalette, которое, как я думаю, может быть здесь уместно, а именно: «Некоторые стили не используют палитру для рисования, например, если они используют собственные движки тем». Что это вообще такое? Я не нашел ссылки на документацию по этой функции, и быстрый поиск по термину «собственный механизм тем qt», похоже, также не дал никаких полезных результатов.
Поскольку в Linux некоторые события надежно инициируются всякий раз, когда происходит изменение системной темы (см. ниже), я полагаю, что Qt может обнаружить изменение темы, он просто не раскрывает данные о нем публично?
Получение уведомления о теме изменения
  • В Linux: через прослушивание событий QEvent::StyleChange QMainWindow приложения; два предостережения и одно примечание:

    Это событие, несмотря на то, что документация QWidget::changeEvent явно упоминает его, не вызывает событие изменения (для меня), но должно быть перехвачено с помощью более общего QWidget::event
  • StyleChange, похоже, запускается только с некоторых версий Qt 6.4 (в моих тестах оно не запускалось 5.15.2 и 6.3.1, но срабатывает для 6.4.2 и 6.5.0beta2).
  • Я также заметил, что есть событие ThemeChange, которое также запускается (одновременно с StyleChange; хотя не уверен, в чем разница между этими двумя, и в каком случае одно будет срабатывать, а другое... Я полагаю, что StyleChange используется для любого изменения стиля виджета, поэтому он также вызывается при применении некоторых настроек таблицы стилей, в то время как ThemeChange действительно указывает на изменение системной темы? Хотя ThemeChange кажется закрытым типом события, по крайней мере, он не отображается в документации (помечено \omitvalue)
[*]В Windows через проверку изменений в ключе реестра HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize (к сожалению, StyleChange там вообще не срабатывает - ошибка Qt?


Определение темной темы в Windows
  • Определен яркий/темный режим приложения). по ключу реестра HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize\AppsUseLightTheme (1 для яркого, 0 для темного). Эта проверка также выполняется в плагинах/платформах/windows/qwindowstheme Qt (

    Код: Выделить всё

    queryDarkMode
    ), но я думаю, что это нигде не представлено публично как общий интерфейс?


Подробнее здесь: https://stackoverflow.com/questions/754 ... ktop-in-qt
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»