Я боюсь, что Qt5 не поддерживается sni-qt на данный момент, так что вам придется либо ждать нового релиза, который будет его поддерживать, либо кодировать его, используя gtk+ и libappindicator, используя это руководство. Есть даже примеры для разных языков. Поскольку Qt5 также распространяет события GLib, это значительно упрощает интеграцию. Сначала вам нужно выяснить, используете ли вы Unity или нет (для поддержки большего количества рабочих столов, чем просто Unity), что вы можете сделать, получив переменную среды XDG_CURRENT_DESKTOP, и если она возвращает Unity, вы создаете appindicator, в противном случае создайте QSystemTrayIcon.
Сначала вам нужно включить необходимые заголовки:
#undefine signals
extern "C" {
#include <libappindicator/app-indicator.h>
#include <gtk/gtk.h>
}
#define signals public
Поскольку app-indicator напрямую использует имя «сигналы», нам нужно отменить определение сигналов «ключевого слова» 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, чтобы объявить функцию, нам нужно использовать extern «C», чтобы не было никакого неопределенного поведения.
extern "C" {
void quitIndicator(GtkMenu *, gpointer);
}
Теперь прокси-функция:
void quitIndicator(GtkMenu *menu, gpointer data) {
Q_UNUSED(menu);
QApplication *self = static_cast<QApplication *>(data);
self->quit();
}
person
stepanbujnak
schedule
06.07.2013