Определить темный стиль/тему приложения используемого в данный момент рабочего стола в 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 нет) t там вообще не сработало - ошибка Qt?). .
Обнаружение темной темы в Windows [*]Яркий/темный режим приложения определяется ключом реестра HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize\AppsUseLightTheme (1 — светлый, 0 — темный). Эта проверка также выполняется в plugins/platforms/windows/qwindowstheme Qt (queryDarkMode`), но я думаю, что это нигде не представлено публично как общий интерфейс?
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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