需求:寫一個自定義彈出菜單,
1、單擊按鈕時展現,單擊空白處或再次單擊按鈕則隱藏
2、菜單內容可以是自定義的widget
3、可以自定義彈出菜單的方向
(可以參考用來實現至任意組件的下拉框)
解決思路:
由於要自定義彈出菜單的方向,而QToolButton的showMenu無法自定義彈出方向,所以一開始想到的方案是
1、QToolButton+獨立的QMenu,QToolButton收到單擊事件時調用QWidget的show;這樣做會發現一個問題,盡管單擊空白處可以隱藏彈窗,但是再次單擊按鈕的時候這個彈窗會又一次彈起(彈窗的隱藏總會先於單擊事件的處理),無法滿足要求1。
2、QToolButton+自定義QWidget的方案,單擊空白隱藏不好控,且容易出現方案1的問題。
解決方案:
要求1可以通過QToolButton的showMenu滿足(QToolButton+自定義QWidget的方案行不通);
要求2可以通過QWidgetAction滿足;
要求3可以通過通過子類化QMenu,在showEvent中移到相應的位置滿足;
github:Demo_QMenu