Qt 和 GTK 应用程序的统一外观
Qt 和 GTK 程序使用不同的窗口小部件工具包来渲染图形用户界面。它们默认带有不同的主题、样式和图标集等,因此“外观和体验”差异显著。本文将帮助您使 Qt 和 GTK 应用程序看起来更相似,以获得更精简和统一的桌面体验。
概述
为了使不同工具包的外观保持一致,您通常需要修改以下内容
- 主题(Theme):应用程序、窗口小部件集等的自定义外观。它通常由样式、图标主题和颜色主题组成。
- 样式(Style):窗口小部件集的图形布局和外观。
- 图标主题(Icon Theme):全局图标集。
- 颜色主题(Color Theme):与样式结合使用的全局颜色集。
您可以选择多种方法
- 使用下面列出的每个工具包的工具分别修改 GTK 和 Qt 样式,并尽量选择外观相似的主题(样式、颜色、图标、光标、字体)。
- 使用特定的 主题引擎,它作为中间层修改其他图形工具包以匹配您的主要工具包。
Qt 和 GTK 的共有样式
为了实现整合,目前有一些可用的窗口小部件样式集,为 Qt 和 GTK 的所有主要版本编写和提供。通过这些样式,无论应用程序是用哪种工具包编写的,您都可以拥有统一的外观。
Qt 主题的 GTK 移植版
这些主题最初是为 Qt 环境创建的,后来被移植到 GTK。
Breeze
Breeze 是 KDE Plasma 的默认 Qt 样式。可以通过安装 breeze 软件包以及用于 GTK 2 和 GTK 3 的 breeze-gtk 软件包来获取。
安装完成后,您可以使用众多 GTK 配置工具 中的任何一个来更改 GTK 主题。
如果您正在运行 KDE Plasma,请安装 kde-gtk-config,注销并重新登录,然后转到系统设置 > 颜色与主题 > 应用程序样式 > 配置 GNOME/GTK 应用程序样式…。在系统设置中设置的字体、图标主题、光标和窗口小部件样式会自动影响 GTK 设置;只需手动使用上述模块设置 GTK 主题即可。
如果您没有运行 KDE Plasma,可以使用 qt5ct-kdeAUR 和 qt6ct-kdeAUR 将 Breeze 应用于 Qt 应用程序,您还可以将配色方案更改为 Breeze-Dark。
GTK 主题的 Qt 移植版
这些主题最初是为 GTK 环境创建的,后来被移植到 Qt。
Adwaita
Adwaita 是 GNOME 的默认主题。GTK 3 版本包含在 gtk3 软件包中,而 GTK 2 版本则在 gnome-themes-extra-gtk2AUR 中。adwaita-qt 是 Adwaita 主题的 Qt 移植版。与模仿 GTK 2 主题的 #QGtkStyle 不同,它提供了一种看起来像 GTK 3 Adwaita 的原生 Qt 样式。它可以通过 安装 adwaita-qt5-gitAUR 和 adwaita-qt6-gitAUR 软件包(分别对应 Qt 5 和 Qt 6)获得。
要设置 Qt 样式,请设置以下 环境变量:QT_STYLE_OVERRIDE=adwaita。或者,使用 qt5ct 软件包。有关更详细的说明,请参阅 Qt#Configuration of Qt 5/6 applications under environments other than KDE Plasma。
移植到 Kvantum 的 GTK 主题
Kvantum (kvantum) 是一个基于 SVG 的 Qt6 样式自定义工具,自带多种内置或外部样式,包括一些流行的 GTK 主题版本,如 Adapta、Arc、Ambiance、Libadwaita 和 Materia。更多主题可以在 KDE Store 上找到。对于 Qt5,您还需要额外安装 kvantum-qt5 软件包。
Kvantum 作为 Qt 样式而非 Qt 平台主题运行。要为所有 Qt 应用程序设置 Kvantum,请在 qt6ct(针对 Qt6)或 qt5ct(针对 Qt5)中进行设置,或者使用环境变量 QT_STYLE_OVERRIDE=kvantum。
主题配置
要 配置 Kvantum 的主题变体(例如 KvLibadwaita),请编辑配置文件
/etc/xdg/Kvantum/kvantum.kvconfig (or ~/.config/Kvantum/kvantum.kvconfig)
... theme=KvLibadwaita ...
或使用 kvantummanager 图形界面。
主题引擎
主题引擎 可以被视为一个轻量级的 API 层,它在一种或多种工具包之间转换主题(不包括图标)。这些引擎在处理过程中添加了一些额外的代码,有人认为这种方案不如使用原生样式优雅和优化。
QGtk3Style
这是一个从 5.7.0 版本开始内置于 qt5-base [2] 和 qt6-base 中的平台主题。它可用于根据当前的 GTK3 样式来渲染 Qt5 和 Qt6 应用程序。可以通过设置以下 环境变量 来启用:QT_QPA_PLATFORMTHEME=gtk3。对于 Adwaita 用户,它可以与 #QAdwaitaDecorations 一起使用以获得完整的外观。
QGtkStyle
这种 Qt 样式使用 GTK 2 来渲染所有组件,以融入 GNOME 及类似的基于 GTK 的环境。从 Qt 4.5 开始,该样式被包含在 Qt 中。它要求安装并配置 gtk2AUR。
这是 Cinnamon、GNOME 和 Xfce 中的默认 Qt4 样式,也是 Cinnamon、GNOME、MATE、LXDE 和 Xfce 中的默认 Qt5 样式。在其他环境中:
- 对于 Qt4,可以通过 Qt 配置 (
qtconfig-qt4) 启用,在 外观 > GUI 样式 下选择 GTK。或者,编辑/etc/xdg/Trolltech.conf(系统级) 或~/.config/Trolltech.conf(用户级) 文件。
~/.config/Trolltech.conf
... [Qt] style=GTK+ ...
- 对于 Qt 5,可以通过安装 qt5-stylepluginsAUR 并设置以下 环境变量 来启用:
QT_QPA_PLATFORMTHEME=gtk2
为达到完全统一,请确保已配置的 GTK 主题 同时支持 GTK 2 和 GTK 3。如果您偏好的主题在配置 Qt 使用 GTK2 后出现渲染不一致的情况,请安装 gtk-theme-switch2AUR 并选择一个主题。您还应确保该主题安装在 /usr/share/themes 中,因为 $XDG_DATA_HOME/themes 目录不会被扫描以查找活动的 GTK 2 主题。
QAdwaitaDecorations
QAdwaitaDecorations 是一个 Qt 装饰插件,为 Wayland 实现了类似 Adwaita 的客户端装饰。它可以通过安装 qadwaitadecorations-qt5AUR 和 qadwaitadecorations-qt6AUR 软件包来获得。安装后,将 QT_WAYLAND_DECORATION=adwaita 设置为环境变量。
QWhiteSurGtkDecorations
QWhiteSurGtkDecorations 是一个 Qt 装饰插件,为 Wayland 实现了类似 WhiteSur-gtk 的客户端装饰。它可以通过安装 qwhitesurgtkdecorations-qt5AUR 和 qwhitesurgtkdecorations-qt6AUR 软件包来获得。安装后,将 QT_WAYLAND_DECORATION=whitesur-gtk 设置为环境变量。
技巧与提示
在 Qt 应用程序中使用 GTK 图标主题
如果您正在运行 Plasma,请运行 kde-gtk-config 并在 系统设置 > 应用程序样式 > GTK 中选择图标主题。
如果您正在使用 GNOME,请运行 dconf-editor 并将 org > gnome > desktop > interface 下的 icon-theme 键更改为您偏好的图标主题。
如果您没有使用 桌面环境(例如在运行带有 i3-wm 的最小系统),请 安装 dconf-editor 并按照上述说明设置图标主题。您可能还需要在配置文件中设置 DESKTOP_SESSION 的值。请参阅 Environment variables#Defining variables 了解实现该目标的可能方法。
$ awk -F= '/icon-theme/ {print $2}' ~/.gtkrc-2.0
在 KDE Plasma 下为 GTK3 应用程序添加标题栏和边框
要使 GNOME/GTK 应用程序显示 KDE/Plasma 标题栏和边框,请禁用客户端装饰,具体操作请参阅 GTK#Client-side decorations。
在 KDE Plasma 下改善 GTK 应用程序的次像素渲染
请参阅 Font configuration#LCD filter。
在 KDE Plasma 下实现统一的文件对话框
要在 KDE Plasma 中使所有应用程序使用相同的文件对话框,可以使用 XDG 桌面门户。
第一步,安装 xdg-desktop-portal 和 xdg-desktop-portal-kde。
环境变量方法
过去,设置环境变量 GTK_USE_PORTAL=1 对于大多数应用程序已经足够。一些较新的 GTK 应用程序可能会改用 GDK_DEBUG=portals(见 GTK NEWS),而其他应用程序(如 Betterbird 128.5.2esr-bb19,见讨论)仍需要原始变量。您可能需要测试哪些变量对您的特定应用程序有效,或者同时使用这两个变量以确保最大兼容性。
配置文件方法
自 xdg-desktop-portal 1.18.0 版本起,建议直接配置门户系统。
设置首选门户后端
这可以针对每个用户进行配置,也可以在系统范围内进行配置。
用户特定配置
创建配置目录
$ mkdir -p ~/.config/xdg-desktop-portal/
将以下内容追加到 ~/.config/xdg-desktop-portal/portals.conf
[preferred] default=kde org.freedesktop.impl.portal.FileChooser=kde
系统范围配置
以 root 用户身份创建该目录
# mkdir -p /etc/xdg/xdg-desktop-portal/
创建包含以下内容的 /etc/xdg/xdg-desktop-portal/portals.conf 文件
[preferred] default=kde org.freedesktop.impl.portal.FileChooser=kde
强制门户服务使用特定桌面环境
这可以确保无论当前运行的是什么桌面环境,门户服务始终使用正确的后端。
用户特定配置
创建覆盖(override)目录
$ mkdir -p ~/.config/systemd/user/xdg-desktop-portal.service.d/
将以下内容追加到 ~/.config/systemd/user/xdg-desktop-portal.service.d/override.conf
[Service] Environment="XDG_CURRENT_DESKTOP=KDE"
系统范围配置
以 root 用户身份创建该目录
# mkdir -p /etc/systemd/user/xdg-desktop-portal.service.d/
创建包含以下内容的 /etc/systemd/user/xdg-desktop-portal.service.d/override.conf 文件
[Service] Environment="XDG_CURRENT_DESKTOP=KDE"
重启门户服务
重新加载 systemd 用户守护进程并重启门户服务
$ systemctl --user daemon-reload $ systemctl --user restart xdg-desktop-portal.service
这种配置方法独立于当前的桌面环境,相比单纯依赖环境变量,被认为在应对未来变更时更加稳健。
应用程序兼容性
并非所有 GTK 应用程序都能正确支持 KDE 文件对话框。
- 使用 Electron 的应用程序应至少使用 Electron 14(见 #19159)并正确实现此功能。
- VSCode 有一个修复此问题的 Pull Request,请参阅 #126113。
- GIMP 尚未实现对门户的使用,见 错误报告。
同步书签
仍有许多 GTK 应用程序未正确实现门户功能(废弃的应用程序或开发者专注于其他任务)。为了简化这些应用程序中的文件选择,您至少可以同步 Dolphin 和 Nautilus 之间的书签。请使用此命令。
$ awk -F\" '/<bookmark href="file/ {print $2}' < $HOME/.local/share/user-places.xbel > $HOME/.config/gtk-3.0/bookmarks
或者,使用 bookmarksync-gitAUR 来实现此目的。在那里,您可以手动编辑并同步双边的书签。
特定应用程序的设置
除了环境变量方法外,一些 GTK 应用程序有自己的设置来强制使用 XDG 门户。
故障排除
主题在 GTK 应用程序中不生效
如果您设置的样式或主题引擎没有在 GTK 应用程序中显示,很可能是因为某些原因导致 GTK 设置文件未加载。您可以按照以下步骤检查系统加载这些文件的预期路径。
$ export | grep gtk
通常,预期文件对于 GTK1 应为 ~/.gtkrc,对于 GTK 2.x 应为 ~/.gtkrc2.0 或 ~/.gtkrc2.0-kde。
系统升级后 GTK 应用程序不再使用 svg (breeze) 图标
尝试运行以下命令来解决此问题
# gdk-pixbuf-query-loaders --update-cache
GTK 应用程序无法完全应用 KDE 系统设置
为了进一步在 GTK 应用程序上集成 Plasma 设置,您可以 安装 gnome-settings-daemon、gsettings-desktop-schemas 和 gsettings-qt5。这将为 GTK 提供适当的 Qt 绑定。
kde-gtk-config 的“系统设置 > 应用程序样式 > GTK”菜单缺失
当 kde-gtk-config 损坏且“应用程序样式 > GTK”菜单从系统设置中缺失时,可以选择 GTK 配置工具(如 lxappearance 和 nwg-look)来配置 GTK 2 和 GTK 3 样式。lxappearance 是桌面无关的,即使它源自 LXDE 项目(它不需要 LXDE 桌面的其他部分)。nwg-look 是一个 GTK3 设置编辑器,旨在在基于 wlroots 的 Wayland 环境中正常工作。其外观和感觉深受 LXAppearance 的影响,但 nwg-look 旨在解决一些使用中的不便。
Dolphin 的主题与 Nautilus 不匹配
请查看 Dolphin#Mismatched folder view background colors 小节,了解如何处理怪异的颜色。
未启用 KDE Plasma XDG 桌面门户
按照 XDG Desktop Portal#Force desktop environment 的说明,将 XDG_CURRENT_DESKTOP=KDE 设置进去。
Qt5:Kvantum 在 Qt 设置程序中作为样式不可用
确保已安装 kvantum-qt5。
QT_QPA_PLATFORMTHEME=kde 无法应用到 KDE 门户
确保为 systemd 服务设置了 QT_QPA_PLATFORMTHEME=kde。由于 KDE 门户是通过 dbus 调用由 systemd 启动的 [5],您可以使用以下配置在 Wayland 会话中设置此变量。
~/.config/environment.d/envvars.conf
QT_QPA_PLATFORMTHEME=kde