Qt 和 GTK 应用程序的统一外观

来自 ArchWiki

QtGTK 基础程序都使用不同的部件工具包来渲染图形用户界面。每个工具包默认都带有不同的主题、样式和图标集等,因此“外观和感觉”差异很大。本文将帮助您使 Qt 和 GTK 应用程序看起来相似,从而获得更流畅和集成的桌面体验。

概述

为了在工具包之间获得相似的外观,您很可能需要修改以下内容

  • 主题:应用程序、部件集等的自定义外观。它通常由样式、图标主题和颜色主题组成。
  • 样式:部件集的图形布局和外观。
  • 图标主题:一组全局图标。
  • 颜色主题:一组与样式结合使用的全局颜色。

您可以选择多种方法

  • 使用下面列出的每个工具包的工具分别修改 GTK 和 Qt 样式,并旨在选择外观相似的主题(样式、颜色、图标、光标、字体)。
  • 使用特殊主题引擎,它充当中间层,修改另一个图形工具包以匹配您的主要工具包。

Qt 和 GTK 的通用样式

有一些部件样式集可用于集成目的,其中为 Qt 和 GTK 编写和提供了构建版本,包括所有主要版本。有了这些,您可以让所有应用程序都具有一种外观,而不管它们是用哪个工具包编写的。

提示: 您可能希望将用户定义的样式应用于 root 应用程序,请参阅 GTK#主题未应用于 root 应用程序Qt#主题未应用于 root 应用程序
注意: 自 3.16 版本以来,GTK 3 不支持 非 CSS 主题,因此以前的解决方案(如 Oxygen-Gtk)不再是可行的选项。

最初基于 Qt 的 GTK 程序主题

这些主题最初是为 Qt 环境创建的,但后来被移植到 GTK。

Breeze

Breeze 是 KDE Plasma 的默认 Qt 样式。可以使用 breeze 软件包和 breeze-gtk 软件包(用于 GTK 2 和 GTK 3)安装它。

安装后,您可以使用许多 GTK 配置工具来更改 GTK 主题。

如果运行 KDE Plasma,请安装 kde-gtk-config,注销并重新登录,然后转到系统设置 > 颜色和主题 > 应用程序风格 > 配置 GNOME/GTK 应用程序风格…。在系统设置中设置的字体、图标主题、光标和部件样式会自动影响 GTK 设置;只有 GTK 主题应使用前面提到的模块手动设置。

如果您没有运行 KDE Plasma,您可以使用 qt5ct-kdeAURqt6ct-kdeAUR 将 Breeze 应用于 qt 应用程序,您也可以将配色方案更改为 Breeze-Dark。

最初基于 GTK 的 Qt 程序主题

这些主题最初是为 GTK 环境创建的,但后来被移植到 Qt。

Adwaita

本文或章节已过时。

原因: Adwaita-qt 项目已无人维护,不再积极开发。[1](在 Talk:Qt 和 GTK 应用程序的统一外观 中讨论)

Adwaita 是默认的 GNOME 主题。GTK 3 版本包含在 gtk3 软件包中,而 GTK 2 版本在 gnome-themes-extra 中。adwaita-qt 是 Adwaita 主题的 Qt 移植版。与模仿 GTK 2 主题的 #QGtkStyle 不同,它提供了原生的 Qt 样式,使其看起来像 GTK 3 Adwaita。它可以分别使用 adwaita-qt4AURadwaita-qt5-gitAURadwaita-qt6-gitAUR 软件包为 Qt 4、5 和 6 版本安装

要将 Qt 样式设置为默认样式

  • 对于 Qt 5,可以通过设置以下环境变量启用它:QT_STYLE_OVERRIDE=adwaita。或者,使用 qt5ct 软件包。有关更详细的说明,请参阅 Qt#在非 KDE Plasma 环境下配置 Qt 5/6 应用程序
  • 对于 Qt4,可以使用Qt 配置 (qtconfig-qt4) 启用它,在外观 > GUI 样式下选择 adwaita。或者,编辑 /etc/xdg/Trolltech.conf(系统范围)或 ~/.config/Trolltech.conf(用户特定)文件
~/.config/Trolltech.conf
...
[Qt]
style=adwaita
...

移植到 Kvantum 的 GTK 主题

Kvantum (kvantum) 是一个基于 SVG 的 Qt6 样式自定义器,它带有各种内置样式,包括一些流行的 GTK 主题(如 Adapta、Arc、Ambiance、Libadwaita 和 Materia)的版本。更多主题可以在 KDE 商店中找到。对于 Qt5,您还需要 kvantum-qt5 软件包。

Kvantum 作为 Qt 样式而不是 Qt 平台主题工作。要为所有 Qt 应用程序设置 Kvantum,请在 Qt6 的 qt6ct 或 Qt5 的 qt5ct 中设置它,或者使用环境变量 QT_STYLE_OVERRIDE=kvantum

主题配置

要为 Kvantum 配置主题变体,例如 KvLibadwaita,请编辑配置文件

/etc/xdg/Kvantum/kvantum.kvconfig (or ~/.config/Kvantum/kvantum.kvconfig)
...
theme=KvLibadwaita
...

或使用 kvantummanager GUI。

主题引擎

主题引擎可以被认为是一个精简的 API 层,它在一个或多个工具包之间转换主题(不包括图标)。这些引擎在此过程中添加了一些额外的代码,并且可以认为这种解决方案不如使用原生样式那样优雅和最佳。

QGtk3Style

这是一个平台主题,内置于 qt5-base(从 5.7.0 版本开始)[2]qt6-base 中。它可用于根据当前的 GTK3 样式设置 Qt5 和 Qt6 应用程序的样式。可以通过设置以下环境变量启用它:QT_QPA_PLATFORMTHEME=gtk3。对于 Adwaita 用户,它可以与 #QAdwaitaDecorations 一起使用,以获得完整的外观。

QGtkStyle

注意: QGtkStyle 已从 qt5-base 5.7.0 [3] 中移除,并添加到 qt5-stylepluginsAUR [4]
警告: 根据 GTK 2 主题,此样式可能会导致渲染问题,例如字体透明或部件不一致。

此 Qt 样式使用 GTK 2 渲染所有组件,以融入 GNOME 和类似的基于 GTK 的环境。从 Qt 4.5 开始,此样式已包含在 Qt 中。它需要安装和配置 gtk2

这是 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 6,可以通过安装 qt6gtk2AUR 并在 qt6ct 中选择 qt6gtk2 样式,或者选择设置以下环境变量: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-qt5AURqadwaitadecorations-qt6AUR 软件包安装。安装后,将 QT_WAYLAND_DECORATION=adwaita 设置为环境变量。

QWhiteSurGtkDecorations

QWhiteSurGtkDecorations 是 Qt 装饰插件,为 Wayland 实现类似 WhiteSur-gtk 的客户端装饰。可以使用 qwhitesurgtkdecorations-qt5AURqwhitesurgtkdecorations-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 的值。有关获得所需结果的可能方法,请参阅 环境变量#定义变量

注意: 如果图标主题未应用,您可能需要检查您输入的首选主题的名称格式是否正确。例如,如果您想将当前活动的图标主题应用于您的 Qt 应用程序,您可以使用以下命令找到其名称的正确格式
$ awk -F= '/icon-theme/ {print $2}' ~/.gtkrc-2.0

为 KDE Plasma 下的 GTK3 应用程序添加标题栏和边框

要使 GNOME/GTK 应用程序显示 KDE/Plasma 标题栏和边框,请禁用客户端装饰,如 GTK#客户端装饰 中所述。

改善 KDE Plasma 下 GTK 应用程序的子像素渲染

请参阅 字体配置#LCD 过滤器

KDE Plasma 下一致的文件对话框

本文或章节的事实准确性存在争议。

为了拥有相同的文件对话框,可以使用 XDG Desktop Portal

安装 xdg-desktop-portalxdg-desktop-portal-kde 并设置 GTK_USE_PORTAL=1 环境变量

请注意,目前并非所有 GTK 应用程序都正确支持 KDE 文件对话框。

使用 electron 的应用程序应至少使用 electron 14(参见 #19159)并正确实现此功能。

VSCode 有一个拉取请求用于修复问题,请参阅 #126113

GIMP 尚未实现 portal 的使用,请参阅 错误报告

注意: 仍然有很多 GTK 应用程序未正确实现 portal(已弃用的应用程序,或者作者专注于其他任务)。为了简化从此类应用程序中选择文件,您至少可以将 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 Portal

故障排除

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-daemongsettings-desktop-schemasgsettings-qt。这将为 GTK 提供正确的 Qt 绑定。

kde-gtk-config “系统设置 > 应用程序风格 > GTK” 菜单丢失

kde-gtk-config 崩溃并且“应用程序风格 > GTK”菜单从系统设置中丢失时,可以选择 GTK 配置工具,如 lxappearancenwg-look,以便能够配置 GTK 2 和 GTK 3 样式。lxappearance 是桌面独立的,即使它来自 LXDE 项目(它不需要 LXDE 桌面的其他部分)。nwg-look 是一个 GTK3 设置编辑器,旨在在基于 wlroots 的 Wayland 环境中正常工作。外观和感觉深受 LXAppearance 的影响,但 nwg-look 旨在将用户从一些不便之处中解放出来。

Dolphin 主题与 Nautilus 不太匹配

查看 文件夹视图背景颜色不匹配 部分,了解如何处理奇怪的着色。

未使用 KDE Plasma XDG Desktop Portal

按照 XDG Desktop Portal#强制桌面环境 中的 XDG_CURRENT_DESKTOP=KDE 进行操作。

Qt5:kvantum 在 Qt 设置应用中不可用作样式

确保已安装 kvantum-qt5