【小白课程】UKUI快捷面板插件开发指南
在openKylin UKUI 4.10版本中,快捷操作窗口可从任务栏托盘中点击唤起,并默认显示在桌面右下角。
目前快捷操作包含以下三种样式:可展开菜单按钮样式、图标样式、进度条样式。现有的功能和对应显示形式如下表所示:
按钮样式 | 功能 |
---|---|
可展开菜单按钮样式 | 无线网络网络链接 |
图标样式 | 模式切换、自动旋转、飞行模式、多屏显示 系统设置、省电模式、夜间模式、冰冻模式 |
进度条样式 | 亮度调节、音量调节 |
下面我们将重点介绍如何实现一个自定义插件。
UKUI 4.10快捷操作源码地址:
其中,ukui-shortcut模块提供了一个用于开发自定义功能的插件接口,我们需要关注path to src/ukui-sidebar/ukui-shortcut/interface中的文件:
1.UkuiShortcutPlugin
基于QtPlugin机制,UkuiShortcutPlugin类定义了插件需要实现的标准接口:
#define UKUI_SHORTCUT_PLUGIN_IFACE_IID "org.ukui.shortcut.UkuiShortcutPluginIface"
#define UKUI_SHORTCUT_PLUGIN_IFACE_TYPE "UKUI_SHORT_CUT"
#define UKUI_SHORTCUT_PLUGIN_IFACE_VERSION "1.0.1"
class UkuiShortcutPlugin : public QObject
{
Q_OBJECT
public:
explicit UkuiShortcutPlugin(QObject *parent = nullptr);
~UkuiShortcutPlugin() override;
/*
* 插件id,需要确保唯一
*/
virtual QString pluginId() = 0;
/**
* 快捷按钮的翻译文件名称
* eg: 自动旋转按钮的翻译文件:auto-rotation-shortcut_zh_CN.qm,
* 那么此方法只需要返回 "auto-rotation-shortcut" 即可。
* 翻译文件会在插件被加载前加载。
*
* @return 可以返回多个翻译文件名称
*/
virtual QStringList translations() = 0;
/**
* 创建快捷按钮,用于实例化一个继承自(Shortcut)的快捷操作类
* @return Shortcut*
*/
virtual Shortcut *createShortcut() = 0;
};
Q_DECLARE_INTERFACE(UkuiShortcut::UkuiShortcutPlugin, UKUI_SHORTCUT_PLUGIN_IFACE_IID)
2. Shortcut
Shortcut类定义了快捷键的类型、操作、是否启用、当前状态信息等接口:
class UKUISHORTCUT_EXPORT Shortcut : public QObject
{
Q_OBJECT
public:
explicit Shortcut(QObject *parent = nullptr) : QObject(parent) {}
/**
* 插件id, 同UkuiShortcutPlugin中的pluginId
*/
virtual QString pluginId() = 0;
/**
* 插件类型(样式), 需要指定不同模式下的按钮元数据。
* PluginMetaType::SystemMode表示不同的系统模式,
* 目前支持pc(SystemMode::PC)和平板(SystemMode::Tablet)两种
*/
virtual QMap<PluginMetaType::SystemMode, PluginMetaData> pluginMetaData() = 0;
/**
* 实现响应前端用户操作
*/
virtual void active(PluginMetaType::Action action) = 0;
/**
* 进度条样式需要实现该函数
*/
virtual void setValue(int value) {Q_UNUSED(value)}
/**
* 返回插件当前的状态信息
*/
virtual const StatusInfo currentStatus() = 0;
/**
* 是否启用此插件
*/
virtual bool isEnable() { return true; }
Q_SIGNALS:
/**
* 状态更新时发送
*/
void statusChanged(const StatusInfo &info);
/**
* 启用状态更新
*/
void enableStatusChanged(bool isEnable);
};
1.构建
以cmake为例,需要在CMakeList.txt中增加
find_package(ukui-shortcut REQUIREDtarget_link_libraries(${PROJECT_NAME} PRIVATE ukui-shortcut)
2.代码实现
首先我们继承Shortcut类实现按钮的主要功能:
#include <QObject>
#include "ukui-shortcut-plugin.h"
class BiliBiliShortcut : public Shortcut
{
Q_OBJECT
public:
explicit BiliBiliShortcut(QObject *parent = nullptr);
~BiliBiliShortcut() override;
QString pluginId() override;
QMap<PluginMetaType::SystemMode, PluginMetaData> pluginMetaData() override;
void active(PluginMetaType::Action action) override;
const StatusInfo currentStatus() override;
bool isEnable() override;
private:
void trigger();
inline void initMetaData();
bool m_isEnable = false;
StatusInfo m_currentStatusInfo;
QMap<PluginMetaType::SystemMode, PluginMetaData> m_metaData;
};
可以在构造函数中定义插件按钮的状态信息和插件类型,并且通过currentStatus()返回。在此我们定义了一个在PC模式和平板模式均为图标样式的快捷按钮:
BiliBiliShortcut::BiliBiliShortcut(QObject *parent) : Shortcut(parent)
{
m_currentStatusInfo.setColor(Color::ColorRole::BaseColor);//当前状态信息初始化
m_currentStatusInfo.setName(tr("bilibili"));
m_currentStatusInfo.setIcon("qrc:///bilibili.svg");
m_currentStatusInfo.setToolTip(tr("bilibili"));
m_isEnable = true;
initMetaData();
}
... ...
void BiliBiliShortcut::initMetaData()
{
// 在PC模式和平板模式均为图标样式的快捷按钮
PluginMetaData pc {true, -1, PluginMetaType::PluginType::Icon};
PluginMetaData tablet {true, -1, PluginMetaType::PluginType::Icon};
m_metaData.insert(PluginMetaType::SystemMode::PC, pc);
m_metaData.insert(PluginMetaType::SystemMode::Tablet, tablet);
}
在active()函数中根据不同PluginMetaType::Action执行对应函数,以下是当事件为Click时,执行打开B站的操作:
void ControlCenterShortcut::active(PluginMetaType::Action action)
{
if (action == PluginMetaType::Action::Click) {
//在此打开B站
QDesktopServices::openUrl(QUrl("https://www.bilibili.com/", QUrl::TolerantMode));
}
}
接下来继承UkuiShortcutPlugin并实现对应接口:
#include <QObject>
#include "ukui-shortcut-plugin.h"
class BiliBiliShortcutPlugin : public UkuiShortcutPlugin
{
Q_OBJECT
Q_PLUGIN_METADATA(IID UKUI_SHORTCUT_PLUGIN_IFACE_IID FILE "bilibili-shortcut.json") // TODO
Q_INTERFACES(UkuiShortcut::UkuiShortcutPlugin)
public:
explicit BiliBiliShortcutPlugin(QObject *parent = nullptr);
QString pluginId() override { return QStringLiteral("bilibili"); };
QStringList translations() override;
Shortcut *createShortcut() override;
};
Q_PLUGIN_METADATA声明自定义插件的元数据信息,FILE是可选的,并指向一个json文件,其中包含插件的类型信息和版本信息,其中版本信息需要和UKUI_SHORTCUT_PLUGIN_IFACE_VERSION宏一致:
{ "Type": "UKUI_SHORT_CUT", "Version": "1.0.1"}
# 插件安装目录set(PLUGIN_INSTALL_DIRS "/usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}/ukui-shortcut-plugins")# 插件翻译文件安装目录set(SHORTCUT_TRANSLATION_FILE_DIR "/usr/share/ukui-sidebar/shortcuts/translations")# 安装.so和翻译文件install(TARGETS ${PROJECT_NAME} LIBRARY DESTINATION "${PLUGIN_INSTALL_DIRS}")install(FILES ${QM_FILES} DESTINATION "${TRANSLATION_FILE_DIR}")
最后,附上示例插件demo源码,地址如下:
https://gitee.com/qiqi49/shortcut-plugin-test