系统托盘应用程序Linux Qt / C ++

时间:2012-05-18 05:20:38

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

我正在使用Qt编写一个使用系统托盘的C ++应用程序。我已使用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);
}

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

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

HTH。