干货分享|UKUI 主题框架实战技巧


大象
大象 2022-10-08 09:29:06 51321
分类专栏: 资讯
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/qiconengine.htmldetails

四、平台主题在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 展示效果


网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。

本文链接:https://www.xckfsq.com/news/show.html?id=16422
赞同 0
评论 0 条
大象L0
粉丝 0 发表 9 + 关注 私信
上周热门
如何使用 StarRocks 管理和优化数据湖中的数据?  2944
【软件正版化】软件正版化工作要点  2863
统信UOS试玩黑神话:悟空  2823
信刻光盘安全隔离与信息交换系统  2718
镜舟科技与中启乘数科技达成战略合作,共筑数据服务新生态  1251
grub引导程序无法找到指定设备和分区  1217
华为全联接大会2024丨软通动力分论坛精彩议程抢先看!  163
点击报名 | 京东2025校招进校行程预告  162
2024海洋能源产业融合发展论坛暨博览会同期活动-海洋能源与数字化智能化论坛成功举办  160
华为纯血鸿蒙正式版9月底见!但Mate 70的内情还得接着挖...  157
本周热议
我的信创开放社区兼职赚钱历程 40
今天你签到了吗? 27
信创开放社区邀请他人注册的具体步骤如下 15
如何玩转信创开放社区—从小白进阶到专家 15
方德桌面操作系统 14
我有15积分有什么用? 13
用抖音玩法闯信创开放社区——用平台宣传企业产品服务 13
如何让你先人一步获得悬赏问题信息?(创作者必看) 12
2024中国信创产业发展大会暨中国信息科技创新与应用博览会 9
中央国家机关政府采购中心:应当将CPU、操作系统符合安全可靠测评要求纳入采购需求 8

加入交流群

请使用微信扫一扫!