乾貨分享|UKUI 主題框架實戰技巧

UKUI 主題框架的實現並非想象中那麼簡單,但世上無難事只怕有心人,首先咱們需要了解一個關鍵接口 QPA,接着通過學習具體的類瞭解如何創建並深入使用平臺主題。本文中奇奇爲大家準備了豐富的控件知識介紹,並且還有 UKUI 實例展示和實戰環節,一起來了解學習下吧~

一、平臺主題(QPA)介紹

QPA 即 Qt Platform Abstraction,是 Qt5 裏面的平臺抽象層,用以取代 Qt for Embedded Linux 以及 Qt4 中的平臺接口。

QPA 插件通過定義 QPlatform 開頭的一系列類的子類實現,其中有兩個根類,QPlatformIntegration 和 QPlatformTheme,前者用於窗口系統的集成,後者用於更深層次的平臺主題化和集成,QStyle 不屬於 QPA,旨在在未修改的 Qt 應用程序中使用盡可能多的平臺主題設置,它允許 Qt 應用程序儘可能地適應環境。

二、平臺主題的創建

在 Linux 系統中我們可以通過 QPlatformThemePlugin 類來創建自己的平臺主題。例如 UKUI 的平臺主題創建方法–如圖 1 所示。要使系統走我們的平臺主題,需要將環境變量“QT_QPA_PLATFORMTHEME”設置爲 json 文件中的 keys 值。

例如在 UKUI 中由 ukui-session-manager 設置環境變量“QT_QPA_PLATFORMTHEME = ukui”。

圖1 設置 keys 值

此外插件都需要一個包含描述插件的元數據的 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、系統平臺對話框

virtual QPlatformDialogHelper *createPlatformDialogHelper(DialogType type) const;

該接口返回了平臺對話框 Helper,通過 helper 連接了平臺對話框與 Qt 的對話框。例如 UKUI 自寫的平臺消息彈窗–如圖 4 所示,效果展示如圖 5、6 所示,圖 5 爲原來的 QMessageBox 界面,圖 6 爲平臺消息彈窗。需要與上函數同時設置才能展示平臺對話框。

圖4 平臺消息彈窗

圖5 原效果展示圖

圖6 現效果展示圖

3、創建系統托盤

virtual QPlatformSystemTrayIcon *createPlatformSystemTrayIcon() const;

QSystemTrayIcon 的工廠函數。如果平臺集成不支持創建任何系統托盤圖標,此函數將返回 0。

4、調色板

virtual const QPalette *palette(Palette type = SystemPalette) const;

創建對應 Palette 類型的調色板。

5、字體

virtual const QFont *font(Font type = SystemFont) const;

創建對應 Font 類型的字體 QFont。

6、主題設置

virtual QVariant themeHint(ThemeHint hint) const;

返回平臺的主題設置。ThemeHint 定義了可以設置的主題屬性。

下面介紹一些重要的主題設置控件。

  1. StyleNames 主題(系統控件的 Style);
  2. SystemIconThemeName 系統圖標主題(QIcon 搜索的圖標目錄);
  3. IconThemeSearchPaths 系統圖標搜索路徑(QIcon 搜索目錄);
  4. SystemIconFallbackThemeName 系統圖標搜索備選目錄(QIcon 搜索備選目錄)(當在系統圖標搜索目錄下搜索不到圖標時,系統會在備選目錄下搜索對應的圖標。在 Linux 系統開發下的自研應用一般將自帶的圖標放在該路徑下。Linux 中該目錄爲”hicolor”);
  5. TextCursorWidth 光標寬度(默認1px);
  6. StartDragDistance 拖放操作開始前,按住按鈕必須移動鼠標的距離,單位爲像素(默認10px);
  7. StartDragTime 拖放操作開始前必須按住鼠標按鈕的時間,單位爲毫秒(默認500ms);
  8. PasswordMaskCharacter 密碼模式下輸入文本輸入字段的字符(默認爲 QChar(0x2022));
  9. PasswordMaskDelay 在密碼模式下文本輸入字段中無遮擋地顯示一個鍵入字母的時間,單位爲毫秒;
  10. MouseDoubleClickInterval 雙擊和連續兩次鼠標點擊的時間限制,單位爲毫秒;
  11. CursorFlashTime 文本光標的閃動(閃爍)時間,單位爲毫秒(默認1000ms)。

以 UKUI 平臺主題的主題設置爲例,如圖 7 所示。

圖7 主題設置

7、基礎圖標

virtual QPixmap standardPixmap(StandardPixmap sp, const QSizeF &size) const;

設置系統中 size 大小的 StandardPixmap 類型(具體參考 Qt 源碼中枚舉 StandardPixmap)基礎 Pixmap 圖片。

8、圖標引擎

virtual QIconEngine *createIconEngine(const QString &iconName) const;

設置系統中 QIcon 的圖標引擎。圖標引擎爲 QIcon 提供渲染功能。每個圖標都有一個相應的圖標引擎,負責以要求的尺寸、模式和狀態繪製圖標。具體可參考 Qt 中 QIconEngine 的文檔:https://doc.qt.io/qt-5/qiconengine.html#details

四、平臺主題在UKUI中的使用

下面介紹 3 種在 UKUI 環境下使用指定的平臺主題的方法。

首先我們得確保系統中安裝了自己的平臺主題庫。以本機環境及 UKUI 的平臺主題爲例進行查看,如圖 8 所示。

圖8 顯示已安裝的平臺主題庫

方法一:終端指定環境變量

export QT_QPA_PLATFORMTHEME=ukui

只有在終端修改方可生效,如圖 9 所示。

圖9 在終端修改環境變量

展示效果如圖 10 所示。

圖10 展示效果

方法二:應用啓動時指定平臺主題

我們可以用終端啓動 Qt 應用時後接參數-platformtheme [平臺主題名(例如:gtk2、gtk3、ukui,社區的有 kde)] -style [主題名(例如:fusion、gtk2、ukui 社區的有 breeze、oxygen)]

例如: peony -platformtheme gtk2 -style fusion

展示效果如圖 11 所示。

圖11 展示效果

方法三:應用代碼中設置環境變量

在 QApplication 初始化之前設置 qputenv(“QT_QPA_PLATFORMTHEME”, “[平臺主題]”);

示例如圖 12 所示。

圖12 展示效果

展示效果如圖 13 所示。

圖13 展示效果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章