我是QT的新手,需要使用应用指标来构建应用.由于QT似乎比GTK容易,我正在QT中进行.
我会提到我已经安装了sni-qt,并且vlc和skype的应用指标在面板上显示正常.我在Ubuntu 13.04 64位使用QT5.
我沿着这个教程一步一步:http://qt-project.org/doc/qt-4.8/desktop-systray.html
但是当我运行它,这是它的出现(十字架是我使用的图标):
我该如何解决?
恐怕Qt5目前不支持sni-qt,所以你不得不等待一个支持它的新版本,或者使用gtk和libappindicator使用
this guide进行编码.甚至还有各种语言的例子.
Since Qt5 also distributes GLib events使得集成更容易一些.首先,您需要了解您是否在Unity上运行(为了支持更多的桌面而不仅仅是统一),您可以通过检索XDG_CURRENT_DESKTOP环境变量并返回Unity来创建appindicator,否则创建QSystemTrayIcon.
原文链接:https://www.f2er.com/ubuntu/347287.html首先,您需要包含所需的标题:
#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信号,声明使用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(); }