當你在Deepin或UOS 上開發 Qt 程序時,如果涉及到文件對話框功能,那么就會遇到調用原生窗口的問題。
如果你使用的是官方的Qt版本,那么在Deepin或者UOS系統上,彈出的文件對話框會是如下這樣:
而Deepin或UOS系統提供的默認對話框:
可以看到,Qt自身提供的對話框太丑,與系統的UI風格不搭,不協調。所以有沒有什么辦法能夠使得Qt彈出的文件對話框是Deepin 或 UOS風格呢
為了能實現Deepin 或 UOS系統風格的文件對話框,有以下方案:
-
使用DTK開發
DTK(Development ToolKit)是UOS基于 Qt 開發的一整套簡單且實用的通用開發框架,不過使用DTK將不能跨平臺,同時依賴很多。
-
使用qt5integration庫
qt5integration 用于Deepin桌面環境的Qt平臺主題集成插件。它包含多個QT5插件,以使DDE更加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-QFileDialog 項目基于qt5integration
進行的魔改,去掉了DTK等依賴,能夠直接編譯使用,完全獨立的庫,開箱即用,并且不需要更改任何代碼。
通過Qt插件機制實現用于 Qt 彈出 Deepin 或 UOS 風格的文件對話框的功能。
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 platformthemes 目錄下,這樣在 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