2012-05-18 59 views
3

我正在用Qt編寫一個應用程序,使用系統托盤。我已經使用示例中所示的QSystemTrayIcon類實現了系統托盤,但它與我的計算機上存在的其他系統托盤圖標沒有相同的行爲。例如,我在Ubuntu 12.04上安裝了Spotify,並顯示帶有下拉菜單的系統托盤圖標。使用我的應用程序,它顯示帶有上下文菜單的系統托盤圖標,這意味着您必須右鍵單擊它才能使菜單處於活動狀態。使用Spotify,所有需要完成的工作就是點擊圖標並顯示菜單。我能做些什麼來獲得Ubuntu中的原生系統托盤圖標?我很喜歡使用X11/Linux的特定代碼,而不是內置的Qt函數。非常感謝。系統托盤應用程序Linux Qt/C++

這裏是我的代碼:

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); 
} 

回答

4

嘗試從QSystemTrayIcon的activated信號下拉菜單。

void Window::iconActivated(QSystemTrayIcon::ActivationReason reason) 
{ 
    switch (reason) { 
     case QSystemTrayIcon::Trigger: 
      // show your menu here 
    } 
} 
+0

這將顯示菜單,但它只顯示上下文菜單,我想讓它顯示非上下文菜單。我認爲這可能與Unity有關,但我不是100%肯定的。 –

+0

我會將您的答案標記爲正確的答案,但我仍然想知道如何綁定到Ubuntu的全局菜單系統。 Qt 4.8.1似乎沒有默認使用全局菜單系統,我無法找到設置來啓用它的構建。 –

+0

'全球菜單系統'是什麼意思?菜單通常位於屏幕頂部ubuntu頂部左側的窗口中? – graphite

0

我評論別人,這裏的利益... 我有同樣的問題,當我們部署我們的產品(使用Qt建)在Ubuntu 12.04 LTS。 我們使用qt.conf的部署方式。 經過大量的狩獵和sni-qt源代碼之後,我發現插件需要被正確地發現。所以我創建了插件,並將其從我們的構建環境複製到插件目錄,相對於qt.conf中提到的我的應用程序路徑,針對「插件=」條目。還確保sni-qt更新並安裝在部署的Ubuntu 12.04機器上。菜單顯示爲其他紙盒應用程序顯示的菜單。 您可以在64位機器上的32位機器或其等效路徑上從/ usr/lib/i386-linux-gnu/qt4/plugins /中複製插件。對於這個問題,systemtrayicon下的插件是必需的。

HTH。

相關問題