cod*_*ing 5 c++ qt gnome kde-plasma
在我们基于 Qt 的 C++ 应用程序中,我尝试根据用户是否配置了深色或明亮主题来自动切换应用程序样式。
我已经弄清楚了更改发生时的通知(见下文,供其他人参考)。
我的主要问题是可靠地检测当前在 Linux 上使用的是深色主题还是明亮主题(对于 Windows,请参见下文);在 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::eventThemeChange事件也被触发(与 ; 同时触发)StyleChange,但不确定这两者之间有什么区别,在什么情况下会触发一个事件,但不会触发另一个事件......我想StyleChange是用于对小部件样式的任何更改,因此在应用某些样式表设置时也会调用它,而ThemeChange实际上表示系统主题的更改?虽然ThemeChange似乎被认为是非公共事件类型,但至少它不' t 出现在文档中(标记为\omitvalue)在 Windows 上,通过检查注册表项的更改HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize(StyleChange不幸的是根本没有触发 - Qt bug?)。。
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize\AppsUseLightTheme(1 为亮,0 为暗)。此检查也在 Qt 的 queryDarkMode` 中完成plugins/platforms/windows/qwindowstheme (,但我认为这没有在任何地方作为通用接口公开公开?欢迎来到地狱!Qtc 已经忽略/放弃桌面平台大约十年了。你正在勇敢地走向许多其他人流血的地方。
由于上述原因,您将必须与 DBus 进行近距离接触。没有人给出答案。
https://doc.qt.io/qt-5/qtdbus-index.html https://doc.qt.io/qt-5/qdbusconnectioninterface-members.html
假设您有 Ubuntu 系列 VM 或开发系统。
总线
未找到命令“qdbus”,但可以使用以下命令安装:
sudo apt install qtchooser
您可以在这里找到有关识别 dbus 服务的不错答案。
https://unix.stackexchange.com/questions/46301/a-list-of-available-d-bus-services
我不知道 DBus 类是否保留到 Qt 6.x 中。我在快速搜索中没有看到他们的文档。
FireFox 必须为他们的浏览器解决这个问题。
https://bugzilla.mozilla.org/show_bug.cgi?id=1734934
在从补丁中窃取一些代码之前,请阅读完整的讨论。尤其
基本操作系统就是一个例子。但这个问题将会更加常见,因为 GNOME 在下一版本中采用了 freedesktop 颜色方案首选项而不是深色 GTK 主题。KDE Plasma 也有一个 PR 来采用这一点。
一些基于 GTK 的桌面仍然坚持 GTK 主题的东西。KDE 几乎没有规则。注意关于libAdwaita的讨论。它可以将亮变暗,而无需在任何公共地方共享该信息。
我不知道 Elementary 存储其设置的内容/位置。
一旦您列出了 org.freedesktop.* 服务,就会有一个指示亮/暗的服务,如果已设置,则事情应该遵循这一点。
您不能真正信任 Gnome 上的任何系统设置,因为 gnome-tweaks 创建更高优先级的设置,而不是更改系统级别设置。您可能会很幸运并找到 org.gnome.* 服务,它将为您提供 DBus 监听/查看的位置。我没有仔细阅读整个文档。
Manjaro 正在接管 Linux 桌面世界。您需要了解 Manjaro/Arch 如何存储这些值。对于许多桌面用户来说,Ubuntu 已经变得过于臃肿和不稳定。几年前,我切换到 Manjaro,只在虚拟机中运行 Ubuntu 来构建 Yocto。
当心基于 QStyle 的应用程序。 https://doc.qt.io/qt-6/qstyle.html
这不是 Qt 特定的事情。许多应用程序设置自己的应用程序风格,不遵循系统主题。他们这样做是为了跨平台提供统一支持。如果您不清楚该声明,请查看 TextMaker。
https://www.softmaker.com/en/softmaker-office-textmaker
用户在安装时选择应用程序主题设置,应用程序会忽略所有系统主题。
“默认”Qt 应用程序应该继承系统主题。这并没有真正在图书馆中得到维护。如果是,您可以创建一个默认的 QStyle 对象(它将继承系统主题),然后取出您需要的值。
从好的方面来说,Mac(最近基于 BSD 的东西)和所有 Linux 发行版都应该有 DBus。DBus 服务列表中的某个位置应该能够识别当前桌面(Gtk、KDE 等),并且从那里您应该能够识别需要查看的内容。
根据 Scheff 的 Cat 2 月 15 日评论。QStyle 这个东西就是你与 QPalette 发生冲突的地方。
https://forum.qt.io/topic/22506/solved-are-qwindowsstyles-gone-in-qt-5
它们已经移到了 Qt 6 中的某个地方,但曾经有很多。
https://het.as.utexas.edu/HET/Software/html/qwindowsvistastyle.html
在某一时刻,Qt 实际上只继承了 KDE 桌面。我不确定它是否还会这样做。在 Qt 4.x 后期,他们提出了所有这些 QStyle 类,它们“接近”当时的“默认”桌面颜色。
调整主题将是一个问题。
https://itsfoss.com/properly-theme-kde-plasma/
请记住,许多主题都是由年轻的开发人员发布的,他们“认为”他们正确地遵循了指南。
https://develop.kde.org/docs/extend/plasma/theme/quickstart/
我知道您希望得到一个完整的答案,但没有。这就是为什么您会看到像 TextMaker 这样的商业产品走自己的路。
如果您确实想出了一个确实可以在大多数平台上运行的类/函数,那么您应该感谢编码宇宙来发布它!
| 归档时间: |
|
| 查看次数: |
2597 次 |
| 最近记录: |