如何为 GTK 和 QT 应用程序使用 QT 文件选择器?

Han*_*Mah 5 kde gtk qt arch-linux

GTK+ 应用程序(例如 Firefox)的文件选择器如下所示:

在此处输入图片说明

对于 qt 应用程序(例如 nomacs),它看起来像这样:

在此处输入图片说明

有没有办法同时为 GTK 和 QT 应用程序使用 QT 文件选择器?

我在安装了 KDE 的情况下运行 arch 4.20。

use*_*686 5

一般来说,没有。GTK 和 Qt 有不同的文件浏览器对话框窗口,因为文件浏览器对话框窗口是工具包的一个组成部分,它不是一些可以简单地与另一个模块交换的外部模块。


也就是说,这可能的,但仅适用于 GTK 3.20 及更高版本。它不会影响 GTK 2 程序。(实际上它也不会影响所有GTK 3 程序,只有一些。主要它不适用于将自己的自定义元素添加到对话框的应用程序,然后大多数其他我不知道为什么。幸运的是,它适用于Firefox,它可能会占您用例的 95%。)

为此,您可以强制 GTK 工具包使用“门户”——Flatpak 集成功能,它通常允许沙盒程序在主机系统上(沙盒外)打开各种选择器并接收结果。这必然意味着应用程序/工具包必须以某种方式调用外部选择器,而不是使用其内置选择器,并且所述外部选择器可以交换。

在这种情况下,您希望在不涉及 Flatpak 的情况下强制启用此功能,并且有一个隐藏选项(尽管仅适用于开发人员 - 正如我已经提到的,仅适用于某些应用程序)。

附加警告:这是一个非常广泛的选项,可能会导致许多其他操作通过“门户”——例如桌面设置、代理配置等。你的旅费可能会改变。如果密封破损,则保修无效。

  1. 您需要安装两个组件:

    • 主要门户服务(代理),称为xdg-desktop-portal

    • KDE 门户实现(用户界面),称为xdg-desktop-portal-kde

  2. 当您使用 KDE 时,安装这些软件包就足够了,它们会在需要时自动启动。跳过这部分的其余部分,直接跳到第 3 步。

    同时,那些试图在 GNOME 中执行此操作的人将需要手动启动所有内容并添加一个环境变量以强制两个组件都使用 KDE 行为。首先启动 KDE 特定的实现,告诉它禁用 Qt 通常的“伪装成 GTK”的东西:

    XDG_CURRENT_DESKTOP="KDE" /usr/lib/xdg-desktop-portal-kde &
    
    Run Code Online (Sandbox Code Playgroud)

    然后启动门户代理,使用相同的环境变量使其选择较早启动的 KDE 门户实现而不是 GNOME 实现:

    XDG_CURRENT_DESKTOP="KDE" /usr/lib/xdg-desktop-portal &
    
    Run Code Online (Sandbox Code Playgroud)

    或者,要通过 D-Bus 自动启动所有内容,您可能希望将这些环境变量传递给 dbus-daemon 和 systemd:

    dbus-update-activation-environment --systemd XDG_CURRENT_DESKTOP="KDE"
    systemctl --user stop xdg-desktop-portal{,-gtk}
    pkill -f xdg-desktop-portal
    
    Run Code Online (Sandbox Code Playgroud)
  3. 最后,启动基于 GTK3 的应用程序,告诉即使在 Flatpak 环境之外也要使用门户:

    GTK_USE_PORTAL="1" zenity --file-selection
    GTK_USE_PORTAL="1" firefox
    
    Run Code Online (Sandbox Code Playgroud)

根据我的测试,这适用于 Zenity、Firefox、GEdit,但不适用于 Mousepad 或 Evince。(我还没有测试过 Chromium,但它已经有了自己的可交换文件选择器。)