天天看點

解決Qt系統托盤上下文菜單無法消失的問題

http://fantasticinblur.iteye.com/blog/902263

在Qt demo中可以找到Qt系統托盤的例子(Desktop -> System Tray)。

右擊系統托盤,可以彈出上下文菜單。

然而在window下,彈出的菜單無法消失,必須點選菜單項或者應用程式窗體才會消失。

如圖:

解決Qt系統托盤上下文菜單無法消失的問題

查閱Qt的BugReport,有相關記錄。參見http://bugreports.qt.nokia.com/browse/QTBUG-7386?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel。

按照issue給出的方法,沒有能夠解決這個問題。

參照Qt幫助文檔:

void QSystemTrayIcon::setContextMenu ( QMenu * menu )

發現有如下說明:

 Note: The system tray icon does not take ownership of the menu. You must ensure that it is deleted at the appropriate time by, for example, creating the menu with a suitable parent object.

注意到Qt demo中給出的示例是這樣初始化上下文菜單的:

Cpp代碼  

解決Qt系統托盤上下文菜單無法消失的問題
  1. trayIconMenu = new QMenu(this);  

 也就是說,該上下文菜單的context是預設的應用程式窗體,然而文檔中已經表述的非常清楚:

The system tray icon does not take ownership of the menu.

是以,當窗體獲得焦點時,系統托盤的上下文菜單才會消失。換言之,如果該菜單的context是整個桌面的話,點選菜單之外的其他任何地方,菜單就會消失,這樣我們的問題就解決了。

修改上文的初始化語句如下:

Cpp代碼  

解決Qt系統托盤上下文菜單無法消失的問題
  1. trayIconMenu = new QMenu(QApplication::desktop());  

至此,我們成功解決了這個問題。

其實Qt的文檔中已經做出了說明,是以嚴格來說,這個bug并不是Qt本身的bug。

希望本文對同樣被這個問題困擾的Qt程式員有所幫助。