【问题标题】:System tray application Linux Qt/C++系统托盘应用 Linux Qt/C++
【发布时间】:2012-05-18 05:20:37
【问题描述】:

我正在用 C++ 编写一个使用系统托盘的 Qt 应用程序。如示例中所示,我已经使用 QSystemTrayIcon 类实现了系统托盘,但它与我计算机上存在的其他系统托盘图标的行为不同。例如,我在 Ubuntu 12.04 上安装了 Spotify,它显示了一个带有下拉菜单的系统托盘图标。在我的应用程序中,它会显示一个带有上下文菜单的系统托盘图标,这意味着您必须右键单击它才能使菜单处于活动状态。使用 Spotify,只需单击图标,菜单就会显示。如何在 Ubuntu 中获取本机系统托盘图标?我可以使用 X11/Linux 的特定代码而不是内置的 Qt 函数。非常感谢。

这是我的代码:

void MainWindow::closeEvent(QCloseEvent *event)
{
    if (trayIcon->isVisible()) {
        hide();
        event->ignore();
    }
}

void MainWindow::createActions()
{
    restoreAction = new QAction(tr("&Show"), this);
    connect(restoreAction, SIGNAL(triggered()), this, SLOT(show()));

    quitAction = new QAction(tr("&Exit"), this);
    connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit()));
}

void MainWindow::createTrayIcon()
{
    trayIconMenu = new QMenu(this);
    accountsMenu = trayIconMenu->addMenu(tr("Accounts"));
    trayIconMenu->addSeparator();
    trayIconMenu->addAction(restoreAction);
    trayIconMenu->addSeparator();
    trayIconMenu->addAction(quitAction);

    trayIcon = new QSystemTrayIcon(this);
    trayIcon->setContextMenu(trayIconMenu);
}

【问题讨论】:

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


    【解决方案1】:

    尝试从 QSystemTrayIcon 的activated 信号下拉菜单。

    void Window::iconActivated(QSystemTrayIcon::ActivationReason reason)
     {
         switch (reason) {
             case QSystemTrayIcon::Trigger:
                 // show your menu here
         }
     }
    

    【讨论】:

    • 这将显示菜单,但它只显示一个上下文菜单,我想让它显示一个非上下文菜单。我认为这可能与 Unity 有关,但我不是 100% 确定。
    • 我会将您的答案标记为正确答案,但我仍然想知道如何与 Ubuntu 的全局菜单系统相关联。 Qt 4.8.1 似乎默认不使用全局菜单系统,我在构建中找不到启用它的设置。
    • “全局菜单系统”是什么意思?菜单通常在窗口的左上角哪个在屏幕顶部的ubuntu中?
    • 我在以前的 Qt 版本中使用 QMenuBar 获得了全局菜单。我会用 Qt 4.8.1 检查它。但我不明白它是如何与托盘连接的。
    • 我在 Qt 4.8.1 中使用 QMenuBar 获得了全局菜单。您想在菜单栏中和单击托盘图标时显示相同的菜单吗?
    【解决方案2】:

    我在这里评论是为了其他人的利益... 当我们在 Ubuntu 12.04 LTS 上部署我们的产品(使用 Qt 构建)时,我遇到了同样的问题。 我们使用 qt.conf 的方式部署。 经过大量搜索和浏览 sni-qt 上的源代码后,我发现需要正确找出插件。所以我创建插件并将插件从我们的构建环境复制到插件目录,该目录相对于我在 qt.conf 中针对“Plugins =”条目提到的应用程序路径。还要确保 sni-qt 已更新并安装在已部署的 Ubuntu 12.04 机器上。菜单显示为其他托盘应用程序的显示。 您可以从 32 位机器上的 /usr/lib/i386-linux-gnu/qt4/plugins/ 或 64 位机器上的等效路径复制插件。对于这个问题,systemtrayicon 下的插件是必需的。

    HTH。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多