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

来自 Arch Linux 中文维基

基于 QtGTK 的程序使用不同的图形库来渲染图形化用户界面,各自具有不同的主题、风格和图标,所以观感明显有所不同。这篇文章将使你的 Qt 和 GTK 程序看起来更相似,以此获得更加现代化、集成化的桌面体验。

介绍[编辑 | 编辑源代码]

要想在不同的图形库之间获得相似的外观,你通常需要修改以下内容:

  • 主题——应用程序和组件等元素的自定义外观。通常包含一套风格、图标主题和颜色主题。
  • 风格——组件的布局和样式。
  • 图标主题——全局图标。
  • 颜色主题——与风格相适应的全局颜色样式。

你可以选择下面的不同方法:

  • 使用下面列出的,适用于各个图形库的工具分别修改 Qt 和 GTK 的主题,以选择外观相似的主题(样式,颜色,图标,光标,字体)。
  • 使用特殊的主题引擎,该引擎作为中间人修改其他图形库的主题,以匹配您的主要图形库。

Qt 和 GTK 通用的主题[编辑 | 编辑源代码]

下面列出了几种主题,Qt 和 GTK 都可使用,并且风格统一。这些主题适配了 Qt 和 GTK 的主要版本。有了这些主题,你就可以在使用不同的图形库构建的应用程序之间得到相同的外观了。

提示:如果希望将用户定义的主题应用于 root 用户的应用, 参考GTK#主题没有应用到 root 用户的应用程序上Qt#主题没有应用到 root 用户的应用程序上
注意: GTK 3 从 3.16 版本开始不再支持非 CSS 主题,因此,以前的解决方案,例如 Oxygen-Gtk,已经不再可用

Breeze[编辑 | 编辑源代码]

Breeze 是 KDE Plasma 的默认 Qt 主题。它可以通过适用于 Qt 5 的 breeze,适用于 Qt 4 的 breeze-kde4AUR 以及适用于 GTK 2 和 GTK 3 的 breeze-gtk 软件包安装。

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

如果当前运行的是 KDE Plasma,请安装 kde-gtk-config,然后从命令行运行之;或者注销后重新登录,接着转到系统设置 > 外观 > 应用程序风格 > 配置 GNOME/GTK 应用程序风格…来配置 GTK 程序的主题。“系统设置”中设置的字体、图标主题、光标和组件样式将自动应用至 GTK,仅 GTK 主题需要用前面提到的 GTK 配置工具手动更改。

Adwaita[编辑 | 编辑源代码]

Adwaita是 GNOME 默认的主题。GTK 3 版本包含在 gtk3 软件包中,而 GTK 2 版本包含在 gnome-themes-extra 中。adwaita-qt是 Adwaita 主题的 Qt 移植版本。与模仿 GTK 2 主题的 #QGtkStyle 不同,它提供了与 GTK 3 Adwaita 相似的原生 Qt 样式。可以通过适用于 Qt 4 的 adwaita-qt4AUR、适用于 Qt 5 的 adwaita-qt5 和适用于 Qt 6 的 adwaita-qt6 软件包来安装此主题。

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

  • 对于 Qt 4,可以使用Qt 配置qtconfig-qt4)启用它,在外观 > GUI 样式中选择adwaita。或者,编辑 /etc/xdg/Trolltech.conf(系统范围)或 ~/.config/Trolltech.conf(用户范围)文件:
~/.config/Trolltech.conf
...
[Qt]
style=adwaita
...

主题引擎[编辑 | 编辑源代码]

主题引擎可以认为是一个简单的 API,用于从一个或多个图形库转译主题(图标除外)。这些引擎为进程添加额外的代码,这种解决方案不如使用原生主题那样优雅可行。

Kvantum[编辑 | 编辑源代码]

Kvantum(kvantum)是一个用于 Qt 5 的,基于 SVG 的可定制主题引擎,具有多种内置样式,包含一些版本的流行 GTK 主题,例如 Adapta、Arc、Ambiance 和 Materia。

Kvantum 被视为一种风格而不是主题。要通过环境变量的方式为所有 Qt 应用设置 Kvantum,使用QT_STYLE_OVERRIDE=kvantum

主题配置[编辑 | 编辑源代码]

要为 Kvantum 设置一个主题变体,如 KvLibadwaita,像这样编辑配置文件:

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

QGtkStyle[编辑 | 编辑源代码]

注意: QGtkStyle 已从 qt5-base 5.7.0 中移除[1]并添加到 qt5-stylepluginsAUR[2]
警告: 取决于 GTK 2 的主题,此样式可能会导致显示问题,例如透明的字体或不一致的部件。

此 Qt 样式使用 GTK 2 渲染所有组件以便于与 GNOME 和类似基于 GTK 的环境相协调。从 Qt 4.5 开始,此样式包含在 Qt 中。它要求安装 gtk2 并进行配置。

这是 Cinnamon、GNOME 和 Xfce 中的默认 Qt 4 样式,也是 Cinnamon、GNOME、MATE、LXDE 和 Xfce 中的默认 Qt 5 样式。至于其他环境:

  • 对于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 配置为使用 GTK 2 后出现了不一致的渲染效果,请安装 gtk-theme-switch2AUR,然后选择一个主题。

QAdwaitaDecorations[编辑 | 编辑源代码]

Qt 装饰插件实现类似 GNOME Adwaita 的客户端装饰,适用于Qt 6 和 QT 5 平台。

安装 qadwaitadecorations-qt5AURqadwaitadecorations-qt6 软件包。

可以通过设置环境变量 QT_WAYLAND_DECORATION=adwaita 开启。

QWhiteSurGtkDecorations[编辑 | 编辑源代码]

QWhiteSurGtkDecorations是一个 Qt 装饰插件,可以在Gnome wayland上实现类似 GNOME WhiteSur-gtk 主题风格的客户端装饰,适用于Qt 6 和 QT 5 平台。

需要安装 qwhitesurgtkdecorations-qt5AURqwhitesurgtkdecorations-qt6 软件包。

可以通过设置环境变量 QT_WAYLAND_DECORATION=whitesur-gtk 启用它。

Tips and tricks[编辑 | 编辑源代码]

在Qt应用程序中使用GTK图标主题[编辑 | 编辑源代码]

如果您正在运行Plasma,请安装kde-gtk-config,然后在系统设置 > 应用程序风格 > 应用样式 > 配置GNOME/GTK应用样式下选择图标主题。

如果您使用的是GNOME,请首先检查是否安装了dconf-editor

然后,运行dconf-editor,然后在org> gnome > desktop > interface 下查找icon-theme键,并将其更改为您的首选图标主题。

如果您使用的不是GNOME,例如,如果您使用的是i3-wm,请首先安装dconf-editor

然后,运行dconf-editor,然后在 org > gnome > desktop> interface下查找icon-theme键,并将其更改为您的图标主题。

由于您使用的不是GNOME,因此可能需要在个人的配置文件中设置DESKTOP_SESSION的值。 为此,请在终端中执行以下代码,然后重新启动系统。

$ echo 'export DESKTOP_SESSION=gnome' >> /etc/profile

或者

export DESKTOP_SESSION=gnome设置在~/.xinitrc中的某个位置,或者在Xprofile中使用一个Display manager

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

添加标题栏和框架到KDE Plasma下的GTK3应用程序[编辑 | 编辑源代码]

要使Gnome/GTK应用程序显示KDE/Plasma的标题栏和框架,请安装gtk3-nocsd-gitAUR并重新启动窗口管理器以加载更新的库路径。

您还可以使用它运行Gtk应用程序:

$ gtk3-nocsd gedit

在KDE Plasma下改善GTK应用程序的亚像素渲染[编辑 | 编辑源代码]

See Font configuration#LCD filter.

一致的文件对话框[编辑 | 编辑源代码]

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

安装 xdg-desktop-portalxdg-desktop-portal-kde,并在环境变量environment variable中设置GTK_USE_PORTAL=1

故障排查[编辑 | 编辑源代码]

主题对GTK程序无效[编辑 | 编辑源代码]

如果你安装的风格或主题引擎在某些GTK程序不能显示,很可能你的GTK设置文件因某些原因不能被加载。你可以检查你的系统找到那些文件作如下设置:

export | grep gtk

通常那些文件设置在 ~/.gtkrc (GTK1), ~/.gtkrc2.0 或 ~/.gtkrc2.0-kde (GTK2)

新版gtk-qt-engine 使用 ~/.gtkrc2.0-kde 和 ~/.kde/env/gtk-qt-engine.rc.sh 设置输出变量 如果你最近移除了gtk-qt-engine然后试图设置GTK主题,你必有要移除 ~/.kde/env/gtk-qt-engine.rc.sh 然后重启。这样做会使GTK外观使用标准的设置 ~/.gtkrc2.0来代替 ~/.gtkrc2.0-kde

系统升级后GTK应用程序不使用svg(breeze)图标[编辑 | 编辑源代码]

尝试运行下面命令来解决问题:

# gdk-pixbuf-query-loaders --update-cache

Flatpak Qt应用程序不使用Gnome Adwaita黑暗主题[编辑 | 编辑源代码]

如果将主题切换为Adwaita-dark后,Flatpak Qt应用程序仍使用精简版,请安装所需的KStyle:

# flatpak install flathub org.kde.KStyle.Adwaita

即使在设置Qt主题后,在GNOME Wayland上运行的Qt应用也有不匹配的窗口装饰外观[编辑 | 编辑源代码]

安装 qadwaitadecorations-qt5AURqadwaitadecorations-qt6AUR,并设置以下环境变量environment variable:export QT_WAYLAND_DECORATION=adwaita

GTK 应用程序不能完全使用 KDE 系统设置[编辑 | 编辑源代码]

为了进一步整合 GTK 应用程序上的 Plasma 设置,可能需要安装 gnome-settings-daemongsettings-desktop-schemasgsettings-qt,这将为 GTK 提供适当的 Qt 绑定。

安装kde-gtk-config后,没有“系统设置>应用程序样式> GTK”菜单[编辑 | 编辑源代码]

使用kde-gtk-config时,可以选择lxappearance之类的GTK configuration tools来配置GTK 2和GTK 3样式。

即使它来自LXDE项目,它也是与桌面无关的(它不需要LXDE桌面的其他部分)

Dolphin主题与Nautilus匹配效果不佳[编辑 | 编辑源代码]

参考 arch:Dolphin#Mismatched_folder_view_background_colors 小节以解决颜色奇怪的问题