作者:@apocelipes
本文为作者原创,转载请注明出处:https://www.cnblogs.com/apocelipes/p/10124381.html
在现代Linux桌面环境上我们时常可以看到类似的消息框:
在freedesktop.org的规范中这种消息框被称为Desktop Notification
,中文名我们形象得称其为“气泡框”。通过调用D-BUS服务org.freedesktop.Notifications
提供的接口即可显示在桌面上。org.freedesktop.Notifications概览
其中Icon
和Hints中的image_path
必须为本地绝对路径或者file://
开头的文件URL。另外使用桌面环境预定义图标的名字也是可以的。所有的气泡框消息请求都是异步的,通常构造请求并发送后用户就可以不再关心后续的信息,如果有特殊需要则可以自定义处理org.freedesktop.Notifications
发送的信号。得益于freedesktop.org的标准规范,包括KDE,GNOME,XFCE4在内的许多桌面环境都提供了对Desktop Notification
的支持,虽然外观上可能存在一些差异但是创建气泡框的方法是一样的。不过不用担心,我们不会直接去使用D-BUS,因为已经有简化的现成方案可供选择了。下面就让我们一起看看这些方案。方案一:调用外部命令
可能你已经知道了,我要介绍的命令就是notify-send
。notify-send
几乎被所有的桌面环境和发行版支持,它依赖于后面会介绍的libnotify和glib,如果你的系统上没有安装可以使用如下命令进行安装:
| sudo apt install libnotify-bin |
具体的参数可以参考这里:https://ss64.com/bash/notify-send.html方案二:通过编程方式实现
在Qt代码中调用外部命令就可以显示气泡框,然而这种方式不够灵活,所以我们需要使用前面提到的libnotify在我们的代码里生成并显示气泡框。libnotify对各个语言都提供了binding,可以参考这里。
这里我们选择使用golang的binding:
| |
| |
|
|
| |
| |
| hello := notify.NotificationNew(, ,) |
| |
| |
| |
上面的代码将会显示一个可以在桌面停留5s的气泡框:
不过如果每次都要使用一大串代码才能显示消息的话必然是低效的,而且需要换算时间至毫秒,所以我写了一个帮助函数在notify.go:首先将时间值转换成毫秒数,如果太小或者不合法就使用默认的停留时间。applicationName是程序的完整名称。
因为气泡框消息是异步的,所以在调用了Show()
之后函数就会返回,后续操作xwindows都会帮我们处理,所以这个函数调用之后是立刻返回的,不会阻塞Qt的gui事件循环,可以放心的使用:
| |
| ShowNotification(, , , *time.Second) |
这样我们也可以轻松地在我们的Qt程序中使用气泡消息框了。参考:
还没有评论,来说两句吧...