I'm writing an application in C++ with Qt that utilizes the system tray.
I have implemented the system tray using a QSystemTrayIcon
class as shown in the examples, but it doesn't have the same behavior as other system tray icons that are present on my computer.
For instance, I have Spotify installed on Ubuntu 12.04 and it shows a system tray icon with a drop down menu. With my application, it shows a system tray icon with a context menu, meaning you have to right click it to make the menu active.
With Spotify, all that needs to be done is to click on the icon and the menu will show.
What can I do to get native system tray icons in Ubuntu?
I'm fine with using specific code for X11/Linux
and not the built-in Qt functions.
Here's my code:
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);
}
I had the same issue when we deployed our product (built using Qt) on Ubuntu 12.04 LTS.
We use the qt.conf
way of deployment.
After a lot of hunting and going through the source on sni-qt
I found that plugins need to be properly found out. So I created and copied the plugins from our build environment to the plugins directory relative to my application path mentioned in qt.conf
against the 'Plugins = '
entry.
We also made sure that sni-qt
is up-to-date and installed on the deployed Ubuntu 12.04 machine.
The menus appeared as they appear for other tray applications.
You can copy plugins from /usr/lib/i386-linux-gnu/qt4/plugins/
on a 32 bit
machine or its equivalent path on 64 bit
machine.
For this problem, plugin under systemtrayicon
is the required one.
HTH.