共计 2985 个字符,预计需要花费 8 分钟才能阅读完成。
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 定义了能够设置的主题属性。
上面介绍一些重要的主题设置控件。
- StyleNames 主题(零碎控件的 Style);
- SystemIconThemeName 零碎图标主题(QIcon 搜寻的图标目录);
- IconThemeSearchPaths 零碎图标搜寻门路(QIcon 搜寻目录);
- SystemIconFallbackThemeName 零碎图标搜寻备选目录(QIcon 搜寻备选目录)(当在零碎图标搜寻目录下搜寻不到图标时,零碎会在备选目录下搜寻对应的图标。在 Linux 零碎开发下的自研利用个别将自带的图标放在该门路下。Linux 中该目录为 ”hicolor”);
- TextCursorWidth 光标宽度(默认 1px);
- StartDragDistance 拖放操作开始前,按住按钮必须挪动鼠标的间隔,单位为像素(默认 10px);
- StartDragTime 拖放操作开始前必须按住鼠标按钮的工夫,单位为毫秒(默认 500ms);
- PasswordMaskCharacter 明码模式下输出文本输出字段的字符(默认为 QChar(0x2022));
- PasswordMaskDelay 在明码模式下文本输出字段中无遮挡地显示一个键入字母的工夫,单位为毫秒;
- MouseDoubleClickInterval 双击和间断两次鼠标点击的工夫限度,单位为毫秒;
- 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/qicone…
四、平台主题在 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 展现成果