Deepin や UOS 上で Qt プログラムを開発する場合、ファイルダイアログ機能が関係する場合、ネイティブウィンドウを呼び出すという問題が発生します。
公式 Qt バージョンを使用している場合、Deepin または UOS システムでは、ポップアップ ファイル ダイアログ ボックスは次のようになります。
Deepin または UOS システムによって提供されるデフォルトのダイアログ ボックス:
Qt 自体が提供するダイアログ ボックスはあまりにも醜く、システムの UI スタイルと一致せず、調整されていないことがわかります。それでは、QtによってポップアップされるファイルダイアログをDeepinまたはUOSスタイルにする方法はありますか?
Deepin または UOS システム スタイルのファイル ダイアログ ボックスを実現するには、次の解決策があります。
-
DTKを使用して開発
DTK (Development ToolKit) は、Qt をベースに UOS が開発したシンプルで実用的な汎用開発フレームワークのセットです。ただし、DTK を使用すると、クロスプラットフォームで同時に多くの依存を行うことができません。
-
qt5integration ライブラリの使用
qt5integration は、Deepin デスクトップ環境用の Qt プラットフォーム テーマ統合プラグインです。これには、DDE を QT5 アプリケーションにさらに適したものにするためのいくつかの QT5 プラグインが含まれています。ただし、qt5integration は依存度が高く、DTK に依存しており (DTK のコンパイルは非常に面倒です)、独立したライブラリとして使用することはできません。
-
Deepin/UOS に付属する Qt
UOS 自体は Qt 5.13 のバージョンを維持しており、UOS スタイルの処理と関連する最適化を行っています。ただし、UOS システムに付属している Qt のバージョンが低すぎるため、Qt 5.15.2 以降との互換性が低く、クロスプラットフォーム機能が失われているため、UOS によって維持されている Qt のバージョンは考慮されていません。Deepin の Qt バージョンは 5.15 で比較的新しいですが、これもクロスプラットフォームではないため考慮されていません。
要約すると、上記のオプションは最良の選択ではありません。
最良の解決策
Deepin-QFileDialogqt5integration
プロジェクトは、DTK やその他の依存関係を削除する魔法の変更に基づいており、コンパイルして直接使用できます。完全に独立したライブラリであり、すぐに使用でき、コードを変更する必要はありません。
Qt が Deepin または UOS スタイルのファイル ダイアログ ボックスをポップアップ表示する機能は、Qt プラグインのメカニズムを通じて実現されます。
https://github.com/L-Super/Deepin-QFileDialog
ダウンロードコード
git clone https://github.com/L-Super/Deepin-QFileDialog.git
コンパイル
mkdir build && cd build
cmake ..
make -j8
libqdeepin.so 動的ライブラリ パスを生成する
build/plugins/platformthemes/libqdeepin.so
使用
生成された libqdeepin.so ダイナミック ライブラリを Qt プラットフォームテーマ ディレクトリにコピーします。これにより、Qt Creator がプログラムを実行するときに、ポップアップ ファイル ダイアログ ボックスが Deepin/UOS スタイルのダイアログ ボックスになります。
/home/Leou/Qt/5.15.2/gcc_64/plugins/platformthemes/
サンプルコード:
#include <QApplication>
#include <QFileDialog>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QFileDialog dialog;
dialog.exec();
return a.exec();
}
効果:
プログラムをパッケージ化して公開するときは、libqdeepin.so をインストール パッケージ構造ディレクトリ plugins/platformthemes に配置します。
├── lib
├── plugins
│ ├── bearer
│ ├── iconengines
│ ├── imageformats
│ ├── platforminputcontexts
│ ├── platforms
│ ├── platformthemes
│ └── xcbglintegrations
└── translations