UKUI主题框架没有想象中的那么简单,但是只要有心,天下无难事,首先我们要了解一个关键接口QPA,然后学习如何通过学习特定课程来创建和深化它使用平台主题。在这篇文章中,奇奇为大家准备了丰富的控件知识介绍,同时还有UKUI实例演示和实战链接。一起来学习学习吧~1.平台主题(QPA)介绍QPA即QtPlatformAbstraction,是Qt5Abstraction层中的平台,用来替代QtforEmbeddedLinux和Qt4中的平台接口。QPA插件是通过在QPlatform的开头定义一系列的子类来实现的。有两个根类,QPlatformIntegration和QPlatformTheme。前者用于窗口系统集成,后者用于更深层次的平台主题化和集成。QStyle不属于QPA,其目的是在未修改的Qt应用中使用尽可能多的平台主题设置,让Qt应用尽可能适应环境。二、平台主题的创建在Linux系统中,我们可以通过QPlatformThemePlugin类来创建自己的平台主题。例如UKUI的平台主题创建方法——如图1所示。要让系统跟随我们的平台主题,需要在json文件中设置环境变量“QT\_QPA\_PLATFORMTHEME”为keys值。例如在UKUI中,环境变量“QT\_QPA\_PLATFORMTHEME=ukui”由ukui-session-manager设置。图1设置键值所有其他插件都需要一个包含描述插件的元数据的json文件。例如UKUI平台主题的json文件如图2所示。图2json文件中的keys值我们还需要将平台插件编译成库安装到Qt加载的指定目录下平台插件,这样Qt就可以加载到自己写的平台插件中了。UKUI安装平台插件的方式是在pro文件中指定库安装位置,如图3所示。图3安装平台插件的指定目录3.平台主题常用接口分析1.是否使用平台对话框virtualboolusePlatformNativeDialog(DialogTypetype)const;是否使用平台对话框。这里只能识别出四个平台对话框,分别是:文件对话框FileDialog、颜色对话框ColorDialog、字体对话框FontDialog、消息对话框MessageDialog。2.系统平台对话框虚拟QPlatformDialogHelper*createPlatformDialogHelper(DialogTypetype)const;该接口返回平台对话框Helper,通过helper连接平台对话框和Qt对话框。比如UKUI写的平台消息弹窗——如图4,效果展示如图5、6,图5是原来的QMessageBox界面,图6是平台消息弹窗.需要与上述功能同时设置才能显示平台对话框。图4平台消息弹窗图5原效果展示图6当前效果展示图3.创建系统托盘虚拟QPlatformSystemTrayIcon*createPlatformSystemTrayIcon()const;QSystemTrayIcon的工厂函数。如果平台集成不支持创建任何系统托盘图标,该函数将返回0。4.PalettevirtualconstQPalette*palette(Palettetype=SystemPalette)const;创建与调色板类型对应的调色板。5.字体虚拟constQFont*font(Fonttype=SystemFont)const;创建Font类型对应的字体QFont。6.主题设置virtualQVariantthemeHint(ThemeHinthint)const;返回平台的主题设置。ThemeHint定义了可以设置的主题属性。下面介绍了一些重要的主题设置控件。StyleNamestheme(系统控件的样式);SystemIconThemeName系统图标主题(QIcon搜索到的图标目录);IconThemeSearchPaths系统图标搜索路径(QIcon搜索目录);SystemIconFallbackThemeName系统图标搜索备用目录(QIconsearchalternatedirectory)(当在系统图标搜索目录中找不到图标时,系统会在备用目录中搜索对应的图标。Linux下开发的自研应用系统一般会把自己的图标放在这个路径下,在linux下,目录是“hicolor”);TextCursorWidth光标宽度(默认1px);StartDragDistance拖放操作开始前,按下按钮时鼠标必须移动的距离,单位为像素(默认10px);StartDragTime开始拖放操作前必须按住鼠标键的时间,单位是毫秒(默认500ms);PasswordMaskCharacter是密码模式下输入文本输入框的字符(默认为QChar(0x2022));PasswordMaskDelay为密码模式下,文本输入框显示一个输入字母无遮挡的时间,单位为毫秒;MouseDoubleClickInterval双击和连续两次鼠标点击的时间限制,以毫秒为单位;CursorFlashTime文本光标的闪烁(闪烁)时间,以毫秒为单位(默认1000毫秒)。以UKUI平台主题的主题设置为例,如图7所示。图7主题设置7.基本图标虚拟QPixmapstandardPixmap(StandardPixmapsp,constQSizeF&size)const;设置系统中大小的StandardPixmap类型(详见Qt源码中StandardPixmap枚举)基本Pixmap图像。8.图标引擎虚拟QIconEngine*createIconEngine(constQString&iconName)const;在系统中设置QIcon的图标引擎。图标引擎为QIcon提供渲染功能。每个图标都有对应的图标引擎,负责按照需要的大小、模式和状态绘制图标。详细请参考Qt中QIconEngine的文档:https://doc.qt.io/qt-5/qicone...4.UKUI中平台主题的使用下面介绍3种使用指定平台主题的方式在UKUI环境方法中。首先我们要确定系统中安装了自己的平台主题库。以本地环境和UKUI的平台主题为例,如图8所示。图8为安装好的平台主题库。方法一:在终端指定环境变量exportQT\_QPA\_PLATFORMTHEME=ukui只有在终端修改时才生效,如图9。图9在终端修改环境变量的显示效果如图10、效果图10方法二:应用启动时指定平台主题。我们可以使用终端启动Qt应用,后面跟参数-platformtheme[平台主题名(例如:gtk2、gtk3、ukui,社区有kde)]-style[主题名(例如:fusion、gtk2、ukui)communityhasbreeze,oxygen)]例如:peony-platformthemegtk2-stylefusion显示效果如图11,效果如图11方法三:在应用代码中设置环境变量,设置qputenv("QT\_QPA\_PLATFORMTHEME","[PlatformTheme]")在QApplication初始化之前;例子如图12显示效果图12显示效果如图13显示效果图13
