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

5

我正在使用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);
}
2个回答

5
尝试从QSystemTrayIcon的激活信号中下拉菜单。
void Window::iconActivated(QSystemTrayIcon::ActivationReason reason)
 {
     switch (reason) {
         case QSystemTrayIcon::Trigger:
             // show your menu here
     }
 }

我会将您的答案标记为正确答案,但我仍然想知道如何与Ubuntu的全局菜单系统连接。Qt 4.8.1似乎默认情况下不使用全局菜单系统,并且我找不到启用构建中的设置。 - Cameron Tinker
“全局菜单系统”是什么意思?通常位于窗口左上角,在Ubuntu中位于屏幕顶部的菜单? - graphite
我在之前的Qt版本中使用QMenuBar得到了全局菜单。我将在Qt 4.8.1中检查它。但我不知道它与托盘有什么关联。 - graphite
我在Qt 4.8.1中使用QMenuBar得到了全局菜单。您是否想在菜单栏和单击托盘图标时显示相同的菜单? - graphite
是的,我想在单击托盘图标时显示相同样式的菜单。我不想在单击托盘图标时显示应用程序菜单,而是托盘菜单。如果有帮助的话,我可以尝试提供屏幕截图来解释我要做什么。 - Cameron Tinker
显示剩余3条评论

1

当我们在Ubuntu 12.04 LTS上部署使用Qt构建的产品时,我遇到了同样的问题。

我们使用qt.conf的方式进行部署。 经过大量搜索和查看sni-qt源代码后,我发现插件需要被正确地找到。因此,我创建并复制了插件从我们的构建环境到相对于我的应用程序路径在qt.conf中提到的插件目录下的'Plugins = '条目。

我们还确保在部署的Ubuntu 12.04机器上安装了最新版本的sni-qt

菜单出现的方式与其他托盘应用程序的方式相同。

您可以从/usr/lib/i386-linux-gnu/qt4/plugins/32位机器上或其等效路径在64位机器上复制插件。

对于这个问题,systemtrayicon下的插件是必需的。

希望对你有所帮助。


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