【问题标题】:How do I create a trayicon with Qt/c++ for all UNIX OS?如何使用 Qt/c++ 为所有 UNIX 操作系统创建一个托盘图标?
【发布时间】:2015-10-02 16:00:52
【问题描述】:

我正在使用 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:
      ;
  }
}

【问题讨论】:

    标签: c++ linux qt system-tray trayicon


    【解决方案1】:

    代码不是问题 - Ubuntu 几年前将系统通知从 sni(状态通知指示器)更改为通过 D-Bus 工作且不向后兼容 sni 的 appnotifier。

    不过,在 Ubuntu 中有一个包 - sni-qt 和 sni-qt:386 - 它有助于显示在 5.xx 版本之前使用 Qt 构建的应用程序的系统托盘图标。

    另外,如果您使用 Qt 5.xx 构建 - 将 Qt 升级到 5.5。它正在通过 D-Bus 与新的应用程序一起工作。

    【讨论】:

    • 使用 Qt 5.5 也是同样的问题。我无法修复它。
    • 你重建了整个项目吗?您还可以检查新的 Qt 5.5 库是否安装正确。还有一件事——也许它真的固定在我正在使用的 Ubuntu 15/04 上——你可以尝试在 14.04 中启用反向端口。
    • 我多次重建项目,我也单独测试了trayIcon,我仍然遇到同样的问题。
    【解决方案2】:

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

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

    关于你的不同行为:你能再检查一下那些 Ubuntu 版本吗?看起来差异来自从 Gnome 到 Unity 的过渡。 Gnome 处理托盘图标的方式与当前 Ubuntu 15.04 在 Unity 中的处理方式有很多不同。

    【讨论】:

    • 所以我需要使用不同的
    • 我不知道你想用这个评论告诉我什么,对不起。
    • 所以我需要为 Unix 使用不同的方法??但是我应该在 Linux 中期待哪个信号呢?双击它实际上不是我的优先事项,为什么我真正需要这样做是为了显示菜单。我检查了版本,两者都是值得信赖的 Ubuntu 14.04.3 LTS,唯一不同的是它的一个是 64 位,另一个是 32 位。
    • 对不起,我还没写完就发了,然后页面不让我编辑评论了。
    • 在设置上下文菜单后,您能否尝试将trayIcon->setVisible(true); 移到函数末尾?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    相关资源
    最近更新 更多