如何使用Qt/C++在所有UNIX操作系统中创建托盘图标?

3
我正在使用Qt/C++创建自己的应用程序,希望它能够跨平台。到目前为止,使用Qt一切都很好,唯一的问题在于托盘图标。
我创建了一个托盘图标并添加了一个菜单,这在Windows中可以正常工作,但在Linux中无法工作。我在两台计算机上测试我的应用程序并得到了两个不同的响应。
在我的桌面电脑(Ubuntu 14.04)上,托盘图标出现在任务栏的右侧,但是没有显示菜单。而在笔记本电脑(也是Ubuntu 14.04)上,托盘图标出现在任务栏的左侧,但是在这种情况下,它显示了菜单,并在双击图标时显示了消息。
我不知道是否有其他方法可以解决这个问题,但这是我的代码。
if (QSystemTrayIcon::isSystemTrayAvailable())
{
  //trayicon
  trayIcon = new QSystemTrayIcon(this);
  trayIcon->setIcon(QIcon(":/Imagenes/iconosPERFQ-23.png"));
  trayIcon->setToolTip(tr("PerfQ Client"));
  trayIcon->setVisible(true);

  connect(trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
                 this, SLOT(iconActivated(QSystemTrayIcon::ActivationReason)));
  //Menu
  logoutAction = new QAction(tr("&Logout"), this);
  trayIconMenu = new QMenu(this);
  trayIconMenu->addAction(logoutAction);
  // Add the menu to the trayicon
  trayIcon->setContextMenu(trayIconMenu);

  connect (logoutAction,SIGNAL(triggered()), this, SLOT(logout()));
}

托盘图标上的激活信号插槽

void Task::iconActivated(QSystemTrayIcon::ActivationReason reason)
{
  switch (reason)
  {
    case QSystemTrayIcon::DoubleClick:
      QMessageBox::information(this,"Double Click", "Double click has been press on trayicon");
      break;
    default:
      ;
  }
}
2个回答

2
代码并没有问题 - 几年前Ubuntu将系统通知从sni(状态通知指示器)更改为通过D-Bus工作的appnotifier,不向后兼容sni。但是,在Ubuntu中有一个软件包 - sni-qt和sni-qt:386 - 可以帮助显示使用Qt构建的5.xx版本之前的应用程序的系统托盘图标。此外,如果您正在使用Qt 5.xx构建 - 将Qt升级到5.5。它可以通过D-Bus与新的应用程序指示器一起使用。

使用Qt 5.5仍然存在同样的问题。我还没有解决它。 - SujaM
你是否已经重新构建整个项目? 另外,你可以检查一下新的Qt 5.5库是否正确安装。还有一件事 - 或许在我所使用的Ubuntu 15/04上已经修复了 - 你可以尝试在14.04中启用后向兼容性。 - Aurel Branzeanu
我已经重新构建了项目多次,并且也尝试了单独测试托盘图标,但仍然遇到同样的问题。 - SujaM

0

在Ubuntu上没有QSystemTrayIcon :: activated。当您(单击)单击图标时,唯一发生的事情就是上下文菜单打开。

这是一个事实,您必须处理的事实,这是从OS X借来的UI选择。它极大地简化了与托盘图标的交互,因为没有单/双/右键单击,每个应用程序使用不同。只有可以完成所有操作的菜单。

关于您的不同行为:您能再次检查那些Ubuntu版本吗?看起来差异随着从Gnome到Unity的过渡而来。 Gnome处理托盘图标的方式在许多方面与当前的Ubuntu 15.04在Unity中所做的不同。


所以我需要使用不同的方法。 - SujaM
抱歉,我不知道你在评论中想要告诉我什么。 - Simon Warta
那么我需要为Unix使用不同的方法吗?但是在Linux中我应该期望哪个信号呢?双击实际上并不是我的优先考虑,我真正需要做的是显示菜单。我检查了版本,两个都是Ubuntu 14.04.3 LTS可靠版,唯一的区别就是一个是64位的,另一个是32位的。 - SujaM
抱歉,在我写完之前我已经发送了它,然后页面不允许我编辑评论。 - SujaM
你能否尝试将 trayIcon->setVisible(true); 移动到函数末尾,在上下文菜单已设置时? - Simon Warta
那么,您需要编写一个最小化的示例来重现错误,并在必要时向Qt或Ubuntu提交错误报告。 - Simon Warta

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