一、应用场景在系统使用过程中,有些应用需要长时间在桌面环境运行,比如网络、声音、麒麟天气、动力电池、输入法、QQ、微信等,为了让用户可以随时访问这些程序,了解它们的状态,任务栏除了快速启动图标外,还需要提供一个特定的消息通知区域,即系统托盘区域,用于向用户发送消息。消息、警告和提示,用户可以通过托盘图标快速访问这些应用程序,也可以通过托盘图标的状态了解程序的状态。2.介绍任务栏(ukui-panel)会提供一个特殊的区域叫系统托盘或通知区,长时间运行的应用程序可以在这里显示图标状态和短信息,也就是右侧的输入法、声音、网络等组件区域.图1任务栏托盘图标区在Linux操作系统中,“系统托盘区”是运行在给定X屏幕上的应用程序,可以显示运行中的应用程序提供的小图标。系统托盘是一个X客户端,具有特定的管理器选择并在给定屏幕上提供容器窗口。Windows将此功能称为“通知区域”。本文使用规范名称“系统托盘”。从UI的角度来看,系统托盘通常用于:●表示一些特殊状态的瞬态图标,如网络、麒麟天气等;●一些强大应用程序的托盘图标将实现更丰富的功能。例如,qq托盘图标可以告诉用户他们有一条新的即时消息或类似的消息。消息通知背后的基本思想是在通知区域创建图标比弹出对话框对用户的干扰更少。但是不能让用户完全忽略这些消息,所以在托盘区加入了这个功能,可以让任务栏托盘图标弹出消息通知。3.什么应用程序需要创建托盘图标基于对这些的了解,我们可以思考一个应用程序什么时候需要创建托盘图标。●用户希望通过任务栏上某些应用程序的图标状态清楚地了解某些应用程序的运行状态,例如当前使用的输入法、是否连接网络、音量大小等。图2托盘图标显示网络的连接和断开●一些后台进程需要一个点击事件来快速打开它们的主界面,比如kylin-video。●一些应用程序的设置需要简单高效。任务栏是常驻应用,点击托盘图标即可轻松完成相关设置。例如,蓝牙设置可以通过右击托盘区的图标来连接和断开连接。虽然在控制面板中也可以实现这个功能,但是打开控制面板连接带来的用户体验并不好。●某些应用程序需要托盘图标才能接受消息通知。我们应该更好地利用托盘区的消息通知。与弹框相比,该区域的消息通知不会对用户造成太大的视觉干扰,但可以起到和消息弹框一样的效果。如果应用程序频繁发送消息,将这些消息以弹出框的形式显示可能不合理,这可能会对用户的其他操作产生巨大影响。所以我们应该给用户选择是否使用托盘区接收消息通知的空间。事实上,微信和其他聊天程序就是这样处理的。它们不会弹出提示框,只是通过托盘图标的闪烁和托盘图标的悬停来显示消息内容。4.托盘应用创建标准目前,用户与当前托盘区域的交互越来越困难。每个应用的行为是不同的(从外观上我们无法判断一个托盘应用的功能是通过右键菜单项实现的还是通过点击事件实现的),有时它们的风格也不同。托盘插件无法统一或改变这些托盘应用的行为和风格,所以托盘应用的开发需要使用更加统一的标准。●目前Linux社区认可的托盘应用的行为和风格是:用图标显示状态,用右键菜单显示功能。(为了统一这部分区域,连gnome都采用了比较极端的方法:取消托盘应用的显示功能,只保留系统应用的几个图标来显示状态。)托盘应用应该由右键菜单完成(或者点击左右键触发相同界面),如果托盘应用的主要功能由主界面完成,那么至少应该包含常用功能在右键菜单中。这样可以最大程度的保持和社区托盘应用一样的交互逻辑。●当弹出的主界面窗口位置靠近任务栏时,尽量使用Qt接口获取可用工作区的大小,以便主界面在可用工作的对应位置正确显示区域。●托盘图标的启动和需要弹出的主窗口界面的启动需要分开,即在任务栏启动过程中只需要加载托盘上的图标,而弹出仅当用户在使用过程中点击图标时才需要加载。主窗口,所以第一次加载会有点慢,不过这在可以接受的范围内。●如果以上处理不能满足特殊的设计需求,(比如ukui-sidebar的侧边弹出功能),可以通过dbus接口获取taskbar的高度和位置,对相关接口进行优化,但必须在没有任务栏异常处理的情况下做好。(托盘应用的弹出界面要尽量避免与任务栏交互,否则会导致当前应用在其他桌面环境下弹出异常的问题)。如果确定你开发的应用程序需要在托盘区提供一个图标来显示状态或消息提示,你必须使用QSystemTrayIcon类。5、使用QSystemTrayIcon在Kylin系统上创建托盘图标常用函数介绍●voidsetContextMenu(QMenu*menu)为托盘图标设置功能菜单。当用户点击鼠标请求系统托盘的上下文菜单时,会弹出该菜单,如果不需要则可以不设置该菜单。●voidsetIcon(constQIcon&icon)设置图标。QIcon该属性包含系统托盘图标。托盘图标应该由系统托盘分配任何大小,并且应该尽最大努力有效地处理任何大小。因此首先要考虑主题图标,托盘插件会根据用户的调整重新绘制图标的大小。●voidsetVisible(boolvisible)设置系统托盘是否可见。通常我们希望系统托盘图标可见。设置为true(或调用show())使系统托盘图标可见;设置为false(或调用hide())以使图标隐藏。●voidshowMessage(constQString&title,constQString&message,QSystemTrayIcon::MessageIconicon=QSystemTrayIcon::Information,intmillisecondsTimeoutHint=10000)显示一个通知消息,使用给定的标题、消息、图标和指定的时间、标题和消息必须是纯文本字符串。消息可以被用户点击,当用户点击时会发出messageClicked()信号。托盘图标可能会要求系统托盘向用户显示通知消息。系统托盘协调通知消息以确保它们具有一致的外观并避免一次显示多个通知消息●voidactivated(QSystemTrayIcon::ActivationReasonreason)当用户激活系统托盘图标时发出此信号。reason指定激活的原因。●voidmessageClicked()当用户单击使用showMessage()显示的消息时,会发出此信号。●boolisSystemTrayAvailable()[静态]如果系统托盘可用,返回真;否则,返回假。如果系统托盘区域当前不可用,但将来可用并且QSystemTrayIcon可见,它将自动添加到系统托盘。在托盘应用入口处调用isSystemTrayAvailable()静态函数检查当前系统是否有可以显示托盘应用的区域,否则可能会导致托盘应用启动早于任务栏,托盘图标无法显示激活任务栏后显示。向Qt注册托盘图标的步骤(1)首先创建一个名为“traytest”的Qt工程,选择QWidget作为基类;(2)在traytest.cpp中引入头文件“#include”;(3)在构造函数中new一个QSystemTrayIcon成员变量;(4)为变量设置图标。如果图标存在于主题库中,则可以直接从主题库中获取。如果没有主题库,可以加载一张图片;(5)调用show()函数显示图标。这样就实现了任务栏托盘图标的显示。下面以火狐(Firefox)图标为例,提供一个demo。运行结果如下:END以上是关于自定义任务栏的内容分享。欢迎您提出自己的建议或分享您成功创建的任务栏图标!
