在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中給出的示例是這樣初始化上下文菜單的:
- trayIconMenu = new QMenu(this);
也就是說,該上下文菜單的context是默認的應用程序窗體,然而文檔中已經表述的非常清楚:
The system tray icon does not take ownership of the menu.
所以,當窗體獲得焦點時,系統托盤的上下文菜單才會消失。換言之,如果該菜單的context是整個桌面的話,點擊菜單之外的其他任何地方,菜單就會消失,這樣我們的問題就解決了。
修改上文的初始化語句如下:
- trayIconMenu = new QMenu(QApplication::desktop());
至此,我們成功解決了這個問題。
其實Qt的文檔中已經做出了說明,所以嚴格來說,這個bug并不是Qt本身的bug。
希望本文對同樣被這個問題困擾的Qt程序員有所幫助。