Я боюсь, что в настоящий момент Qt5 не поддерживается sni-qt, поэтому вам придется либо ждать нового релиза, который будет поддерживать его, либо закодировать его с помощью gtk + и libappindicator, используя this guide. Есть даже примеры для разных языков. Since Qt5 also distributes GLib events, что делает интеграцию намного проще. Сначала вам нужно выяснить, используете ли вы Unity или нет (для поддержки большего количества рабочих столов, чем единство), что вы можете сделать, извлекая переменную окружения XDG_CURRENT_DESKTOP, и если она вернет Unity, вы создаете appindicator, иначе создайте QSystemTrayIcon.
Прежде всего, необходимо включить необходимые заголовки:
#undefine signals
extern "C" {
#include <libappindicator/app-indicator.h>
#include <gtk/gtk.h>
}
#define signals public
Поскольку приложение-индикатор непосредственно использует название «сигналы» нам нужно неопределенные сигналы «ключевое слово» по умолчанию Qt на который обычно переводит к общественности. Затем, поскольку мы кодируем C++, а libappindicator закодирован в C, нам нужно использовать extern «C», чтобы не использовать кодирование имен C++.
Следующая создать AppIndicator/QSystemTrayIcon основаны на каком рабочем столе мы на:
QString desktop;
bool is_unity;
desktop = getenv("XDG_CURRENT_DESKTOP");
is_unity = (desktop.toLower() == "unity");
if (is_unity) {
AppIndicator *indicator;
GtkWidget *menu, *item;
menu = gtk_menu_new();
item = gtk_menu_item_new_with_label("Quit");
gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
g_signal_connect(item, "activate",
G_CALLBACK(quitIndicator), qApp); // We cannot connect
// gtk signal and qt slot so we need to create proxy
// function later on, we pass qApp pointer as an argument.
// This is useful when we need to call signals on "this"
//object so external function can access current object
gtk_widget_show(item);
indicator = app_indicator_new(
"unique-application-name",
"indicator-messages",
APP_INDICATOR_CATEGORY_APPLICATION_STATUS
);
app_indicator_set_status(indicator, APP_INDICATOR_STATUS_ACTIVE);
app_indicator_set_menu(indicator, GTK_MENU(menu));
} else {
QSystemTrayIcon *icon;
QMenu *m = new QMenu();
m->addAction(tr("Quit"), qApp, SLOT(quit()));
}
Наконец мы создаем функцию прокси для вызова сигнала Qt от него, чтобы объявить функцию, мы должны использовать Экстерн «C» поэтому не будет никакого неопределенного поведения.
extern "C" {
void quitIndicator(GtkMenu *, gpointer);
}
Теперь функция прокси:
void quitIndicator(GtkMenu *menu, gpointer data) {
Q_UNUSED(menu);
QApplication *self = static_cast<QApplication *>(data);
self->quit();
}
Какая версия Qt является что? Вы пробовали последнюю версию (5.1.0-rc1)? – peppe