![如何将 QT 文件选择器用于 GTK 和 QT 应用程序?](https://linux22.com/image/1579401/%E5%A6%82%E4%BD%95%E5%B0%86%20QT%20%E6%96%87%E4%BB%B6%E9%80%89%E6%8B%A9%E5%99%A8%E7%94%A8%E4%BA%8E%20GTK%20%E5%92%8C%20QT%20%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%EF%BC%9F.png)
答案1
一般来说不是。GTK 和 Qt 具有不同的文件浏览器对话窗口,因为文件浏览器对话窗口是工具包的一个组成部分,它不是可以简单地与另一个交换的外部模块。
话虽如此,有点儿可能,但仅适用于 GTK 3.20 及更高版本。它不会影响 GTK 2 程序。(实际上它不会影响全部GTK 3 程序也不行,只有一些。主要是它不适用于向对话框添加自己的自定义元素的应用程序,然后大多数其他我不知道为什么。幸运的是,它可以与 Firefox 一起使用,这可能是您 95% 的使用情况。)
为此,您可以强制 GTK 工具包使用“门户”——Flatpak 集成功能,它通常允许沙盒程序在主机系统(沙盒外)上打开各种选择器并接收结果。这必然意味着应用程序/工具包必须以某种方式调用外部选择器,而不是使用其内置选择器,并且所述外部选择器可可換换的。
在这种情况下,您想强制启用此功能而不涉及 Flatpak,并且有一个隐藏选项(尽管仅供开发人员使用 - 而且正如我已经提到的,仅适用于某些应用程序)。
额外警告:这是一个非常广泛的选项,可能会导致许多其他操作通过“门户”进行 - 例如桌面设置、代理配置等。您的里程可能会有所不同。如果密封破损,保修将失效。
您需要安装两个组件:
主门户服务(代理),称为xdg-桌面门户。
KDE 门户实现(用户界面),称为xdg-桌面门户-kde。
由于您使用的是 KDE,因此只需安装这些软件包即可,它们将在需要时自动启动。跳过此部分的其余部分,直接跳至步骤 3。
同时,那些试图在 GNOME 中执行此操作的人将需要手动启动所有程序并添加环境变量以强制两个组件使用 KDE 行为。首先启动 KDE 特定的实现,告诉它禁用 Qt 常用的“伪装成 GTK”功能:
XDG_CURRENT_DESKTOP="KDE" /usr/lib/xdg-desktop-portal-kde &
然后启动门户代理,使用相同的环境变量使其选择之前启动的 KDE 门户实现而不是 GNOME 门户实现:
XDG_CURRENT_DESKTOP="KDE" /usr/lib/xdg-desktop-portal &
或者,为了使一切通过 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
最后,启动基于 GTK3 的应用程序,告知即使在 Flatpak 环境之外也可以使用门户:
GTK_USE_PORTAL="1" zenity --file-selection GTK_USE_PORTAL="1" firefox
根据我的测试,它适用于 Zenity、Firefox、GEdit,但不适用于 Mousepad 或 Evince。(我还没有测试过 Chromium,但它已经有自己的可切换文件选择器了。)