QT Systray图标出现在Ubuntu上的启动器旁边,而不是面板上

前端之家收集整理的这篇文章主要介绍了QT Systray图标出现在Ubuntu上的启动器旁边,而不是面板上前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我是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.

首先,您需要包含所需的标题

#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();                                                                 
}
原文链接:https://www.f2er.com/ubuntu/347287.html

猜你在找的Ubuntu相关文章