系统托盘应用程序Linux Qt / 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); } 

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

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

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

HTH。