干貨分享|UKUI 主題框架實戰(zhàn)技巧

UKUI 主題框架的實現(xiàn)并非想象中那么簡單,但世上無難事只怕有心人,首先咱們需要了解一個關鍵接口 QPA,接著通過學習具體的類了解如何創(chuàng)建并深入使用平臺主題。本文中奇奇為大家準備了豐富的控件知識介紹,并且還有 UKUI 實例展示和實戰(zhàn)環(huán)節(jié),一起來了解學習下吧~
一、平臺主題(QPA)介紹
QPA 即 Qt Platform Abstraction,是 Qt5 里面的平臺抽象層,用以取代 Qt for Embedded Linux 以及 Qt4 中的平臺接口。
QPA 插件通過定義 QPlatform 開頭的一系列類的子類實現(xiàn),其中有兩個根類,QPlatformIntegration 和 QPlatformTheme,前者用于窗口系統(tǒng)的集成,后者用于更深層次的平臺主題化和集成,QStyle 不屬于 QPA,旨在在未修改的 Qt 應用程序中使用盡可能多的平臺主題設置,它允許 Qt 應用程序盡可能地適應環(huán)境。
二、平臺主題的創(chuàng)建
在 Linux 系統(tǒng)中我們可以通過 QPlatformThemePlugin 類來創(chuàng)建自己的平臺主題。例如 UKUI 的平臺主題創(chuàng)建方法--如圖 1 所示。要使系統(tǒng)走我們的平臺主題,需要將環(huán)境變量“QT_QPA_PLATFORMTHEME”設置為 json 文件中的 keys 值。
例如在 UKUI 中由 ukui-session-manager 設置環(huán)境變量“QT_QPA_PLATFORMTHEME = ukui”。

圖1 設置 keys 值
此外插件都需要一個包含描述插件的元數(shù)據(jù)的 json 文件 。例如 UKUI 平臺主題 json 文件,如圖 2 所示。
![]()
圖2 json 文件中的 keys 值
我們還需要將平臺插件編譯成庫安裝在 Qt 加載平臺插件的指定目錄,這樣 Qt 才能加載到我們自己寫的平臺插件。UKUI 安裝平臺插件的方法是在 pro 文件中指定了庫安裝的位置,如圖 3 所示。

圖3 安裝平臺插件的指定目錄
三、平臺主題常用接口分析
1、是否使用平臺對話框
virtual bool usePlatformNativeDialog(DialogType type) const;
是否使用平臺對話框。這里只能判斷出 4 種平臺對話框,分別是:文件對話框 FileDialog、顏色對話框 ColorDialog、字體對話框 FontDialog、消息對話框 MessageDialog。
2、系統(tǒng)平臺對話框
virtual QPlatformDialogHelper *createPlatformDialogHelper(DialogType type) const;
該接口返回了平臺對話框 Helper,通過 helper 連接了平臺對話框與 Qt 的對話框。例如 UKUI 自寫的平臺消息彈窗--如圖 4 所示,效果展示如圖 5、6 所示,圖 5 為原來的 QMessageBox 界面,圖 6 為平臺消息彈窗。需要與上函數(shù)同時設置才能展示平臺對話框。
![]()
圖4 平臺消息彈窗

圖5 原效果展示圖

圖6 現(xiàn)效果展示圖
3、創(chuàng)建系統(tǒng)托盤
virtual QPlatformSystemTrayIcon *createPlatformSystemTrayIcon() const;
QSystemTrayIcon 的工廠函數(shù)。如果平臺集成不支持創(chuàng)建任何系統(tǒng)托盤圖標,此函數(shù)將返回 0。
4、調(diào)色板
virtual const QPalette *palette(Palette type = SystemPalette) const;
創(chuàng)建對應 Palette 類型的調(diào)色板。
5、字體
virtual const QFont *font(Font type = SystemFont) const;
創(chuàng)建對應 Font 類型的字體 QFont。
6、主題設置
virtual QVariant themeHint(ThemeHint hint) const;
返回平臺的主題設置。ThemeHint 定義了可以設置的主題屬性。
下面介紹一些重要的主題設置控件。
StyleNames 主題(系統(tǒng)控件的 Style);
SystemIconThemeName 系統(tǒng)圖標主題(QIcon 搜索的圖標目錄);
IconThemeSearchPaths 系統(tǒng)圖標搜索路徑(QIcon 搜索目錄);
SystemIconFallbackThemeName 系統(tǒng)圖標搜索備選目錄(QIcon 搜索備選目錄)(當在系統(tǒng)圖標搜索目錄下搜索不到圖標時,系統(tǒng)會在備選目錄下搜索對應的圖標。在 Linux 系統(tǒng)開發(fā)下的自研應用一般將自帶的圖標放在該路徑下。Linux 中該目錄為"hicolor");
TextCursorWidth 光標寬度(默認1px);
StartDragDistance 拖放操作開始前,按住按鈕必須移動鼠標的距離,單位為像素(默認10px);
StartDragTime 拖放操作開始前必須按住鼠標按鈕的時間,單位為毫秒(默認500ms);
PasswordMaskCharacter 密碼模式下輸入文本輸入字段的字符(默認為 QChar(0x2022));
PasswordMaskDelay 在密碼模式下文本輸入字段中無遮擋地顯示一個鍵入字母的時間,單位為毫秒;
MouseDoubleClickInterval 雙擊和連續(xù)兩次鼠標點擊的時間限制,單位為毫秒;
CursorFlashTime 文本光標的閃動(閃爍)時間,單位為毫秒(默認1000ms)。
以 UKUI 平臺主題的主題設置為例,如圖 7 所示。

圖7 主題設置
7、基礎圖標
virtual QPixmap standardPixmap(StandardPixmap sp, const QSizeF &size) const;
設置系統(tǒng)中 size 大小的 StandardPixmap 類型(具體參考 Qt 源碼中枚舉 StandardPixmap)基礎 Pixmap 圖片。
8、圖標引擎
virtual QIconEngine *createIconEngine(const QString &iconName) const;
設置系統(tǒng)中 QIcon 的圖標引擎。圖標引擎為 QIcon 提供渲染功能。每個圖標都有一個相應的圖標引擎,負責以要求的尺寸、模式和狀態(tài)繪制圖標。具體可參考 Qt 中 QIconEngine 的文檔:https://doc.qt.io/qt-5/qiconengine.html#details
四、平臺主題在UKUI中的使用
下面介紹 3 種在 UKUI 環(huán)境下使用指定的平臺主題的方法。
首先我們得確保系統(tǒng)中安裝了自己的平臺主題庫。以本機環(huán)境及 UKUI 的平臺主題為例進行查看,如圖 8 所示。
![]()
圖8 顯示已安裝的平臺主題庫
方法一:終端指定環(huán)境變量
export QT_QPA_PLATFORMTHEME=ukui
只有在終端修改方可生效,如圖 9 所示。
![]()
圖9 在終端修改環(huán)境變量
展示效果如圖 10 所示。

圖10 展示效果
方法二:應用啟動時指定平臺主題
我們可以用終端啟動 Qt 應用時后接參數(shù)-platformtheme [平臺主題名(例如:gtk2、gtk3、ukui,社區(qū)的有 kde)] -style [主題名(例如:fusion、gtk2、ukui 社區(qū)的有 breeze、oxygen)]
例如: peony -platformtheme gtk2 -style fusion
展示效果如圖 11 所示。

圖11 展示效果
方法三:應用代碼中設置環(huán)境變量
在 QApplication 初始化之前設置 qputenv("QT_QPA_PLATFORMTHEME", "[平臺主題]");
示例如圖 12 所示。

圖12 展示效果
展示效果如圖 13 所示。

圖13 展示效果