Qt - 通知是否可以在没有系统托盘图标的情况下实现?

9
我正在编写一个C++ Qt桌面应用程序。
是否可能在Qt中显示类似于Skype的通知,而不需要创建托盘图标?
我找到的所有通知参考都需要一个托盘图标,但我不想创建它。
当应用程序打开和最小化时,通知应该显示。

请指定您的目标操作系统。 - Aleksandr Kravets
@AleksandrKravets 目前是Windows 7,但未来可能会扩展到Linux。 - sara
4个回答

9
更新: 似乎这不适用于最新版本的Qt。我发现一个解决方法,即在创建QSystemTrayIcon后:
  • 调用show()
  • 使用showMessage显示所需的消息
  • 调用hide()

这对我来说可以正常工作。


创建一个QSystemTrayIcon,但从不调用show()。然后,您可以使用QSystemTrayIcon::showMessage来显示您的弹出窗口。


但是这样我就无法为通知添加样式,它看起来会像系统通知一样,对吧? - sara
在Mac和Windows上尝试过(Qt 5.3,OS X 10.10 / Win 8.1):只有在调用show()之后才显示消息,因此这似乎不是问题的有效答案。 - pi3
如果你从未调用show(),这将不起作用。但是你可以先调用show(),然后调用showMessage,最后再调用hide(),这样就会产生类似的效果。 - Romário

3

只需创建弹出窗口类并在桌面的某个位置显示它,始终保持置顶标志。通知也可以是一个小部件。


1
@sara:没有人想替你完成工作,所以请展现出一些努力。例如,编写一个 sscce 并告诉我们在编写它时出了什么问题。官方文档 总是一个很好的起点。 - Aleksandr Kravets
通知应该像其他通知一样,而不仅仅是一个随意的窗口。 - LtWorf
1
@LtWorf Skype不使用系统通知,它只是作为一个例子。在完美的世界里,当然可以使用系统通知,但是由于平台之间存在太多差异,有时候实现你需要的行为是不可能的。 - Kamil Klimek

2

有点晚了,但您可能会对这个库感兴趣:https://github.com/Snorenotify/Snorenotify/

Snorenotify是一个多平台的Qt通知框架。使用插件系统,可以在Windows、Unix和Mac上创建许多不同的通知系统。


1

我遇到了与 OP(但是使用 Python!!)类似的问题,Romario 的答案让我达成了一半的目标。

在我的场景中,我有一个系统托盘工具,通过锁文件来确保只有一个正在运行。但是用户反馈要求,如果他们尝试启动已经打开的工具,我需要提供某种形式的反馈。

我发现,在 Windows 上,如果在 show() 之前调用 setVisible(False),就可以防止图标在系统托盘中出现/累积,这与 Romarios 的答案相符 :)

我的完整示例:

class SimpleNotifier(QtWidgets.QWidget):

    def notify_running(self):
        tray_icon = QtGui.QIcon(Params.TRAY_ICON)
        self.setIcon(tray_icon)
        self.setVisible(False)
        self.show()
        self.showMessage("Hi User", "Application already inside your sys-tray", QtGui.QIcon(Params.TRAY_ICON))

def notify():
    app = QtWidgets.QApplication(sys.argv)
    notify = HUBController.SimpleNotifier()
    notify.notify_running()
    app.exit()

notify()
    

我之前一直潜水,多年后注册了一个账号才发表这篇帖子。 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接