web-dev-qa-db-ja.com

QTアプリとGTKアプリで同じファイルピッカーを使用する方法

GTK +アプリ(Firefoxなど)のファイルピッカーは次のようになります。

enter image description here

Qtアプリ(例:nomacs)の場合、次のようになります。

enter image description here

GTKアプリとQTアプリの両方にQTファイルピッカーを使用する方法はありますか?

KDEをインストールしてArch4.20を実行しています。

3
HanMah

一般的にはありません。 GTKとQtのファイルブラウザダイアログウィンドウは異なります。これは、ファイルブラウザダイアログウィンドウがツールキットの不可欠な部分であり、単に別のモジュールと交換できる外部モジュールではないためです。


そうは言っても、それは種類可能ですが、GTK3.20以降でのみ可能です。 GTK2プログラムには影響しません。 (実際には影響はありませんall GTK 3プログラム、一部のみ。主に、ダイアログに独自のカスタム要素を追加するアプリでは機能しませんが、他のほとんどのプログラムでは機能しません。幸いなことに、Firefoxで動作します。Firefoxはおそらくユースケースの95%になるでしょう。)

これを行うには、GTKツールキットに「ポータル」を使用させることができます。これはFlatpak統合機能であり、通常、サンドボックス化されたプログラムがホストシステム(サンドボックス外)でさまざまなピッカーを開いて結果を受け取ることができます。これは必然的に、アプリ/ツールキットが組み込みのピッカーを使用する代わりに、何らかの方法で外部ピッカーを呼び出す必要があることを意味し、外部ピッカー可能性があります交換可能です。

この状況では、Flatpakを使用せずにこの機能を強制的に有効にする必要があり、そのための非表示のオプションがあります(ただし、開発者のみを対象としています。すでに述べたように、一部のアプリでのみ機能します)。

追加の警告:これは非常に幅広いオプションであり、デスクトップ設定、プロキシ構成など、他の多くの操作が「ポータル」を通過する可能性があります。あなたのマイレージは異なる場合があります。シールが破れた場合、保証は無効になります。

  1. 2つのコンポーネントをインストールする必要があります。

    • xdg-desktop-portalと呼ばれるメインポータルサービス(ブローカー)。

    • xdg-desktop-portal-kdeと呼ばれるKDEポータルの実装(ユーザーインターフェイス)。

  2. KDEを使用しているので、これらのパッケージをインストールするだけで十分であり、必要に応じて自動的に開始されます。この部分の残りをスキップして、ステップ3に直接ジャンプします。

    一方、GNOME内でこれを実行しようとする場合は、すべてを手動で開始し、環境変数を追加して、両方のコンポーネントにKDE動作を使用させる必要があります。まず、KDE固有の実装を開始し、Qtの通常の「GTKとしてのマスカレード」を無効にするように指示します。

    XDG_CURRENT_DESKTOP="KDE" /usr/lib/xdg-desktop-portal-kde &
    

    次に、同じ環境変数を使用してポータルブローカーを起動し、GNOMEではなく以前に起動したKDEポータル実装を選択するようにします。

    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
    
  3. 最後に、GTK3ベースのアプリを起動し、Flatpak環境の外でもポータルを使用するように指示します。

    GTK_USE_PORTAL="1" zenity --file-selection
    GTK_USE_PORTAL="1" firefox
    

私のテストによると、これはZenity、Firefox、GEditで機能しますが、MousepadやEvinceでは機能しません。 (私はChromiumをテストしていませんが、とにかく独自のスワップ可能なファイルピッカーをすでに持っています。)

4
user1686