Я разобрался с уведомлением о том, когда происходит изменение (см. ниже, для справки для других).
Моя основная проблема — надежное определение того, используется ли в настоящее время темная или яркая тема в 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\AppsUseLightTheme (1 для яркого, 0 для темного). Эта проверка также выполняется в плагинах/платформах/windows/qwindowstheme Qt (), но я думаю, что это нигде не представлено публично как общий интерфейс?
Код: Выделить всё
queryDarkMode
Подробнее здесь: https://stackoverflow.com/questions/754 ... ktop-in-qt
Мобильная версия