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

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

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

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

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

如圖:


 

查閱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代碼  收藏代碼
  1. trayIconMenu = new QMenu(this);  

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

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

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

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

Cpp代碼  收藏代碼
  1. trayIconMenu = new QMenu(QApplication::desktop());  

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

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

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

 

發佈了57 篇原創文章 · 獲贊 3 · 訪問量 46萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章