4

我正在用 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);
}
4

2 回答 2

4

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

void Window::iconActivated(QSystemTrayIcon::ActivationReason reason)
 {
     switch (reason) {
         case QSystemTrayIcon::Trigger:
             // show your menu here
     }
 }
于 2012-05-18T05:51:50.683 回答
1

我在这里为其他人的利益发表评论......当我们在 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。

于 2013-10-22T12:09:54.110 回答