2013-10-03 25 views
2

我試圖實現一個「打開」按鈕,如果用戶按下並保存,用戶的應用程序菜單將會彈出;但只要用戶釋放鼠標,菜單應該消失。如果用戶在沒有選擇菜單上的應用程序的情況下釋放鼠標,則應該使用默認應用程序打開該文件。眼下QToolButton彈出菜單隻有當按下並保持

self.ui_open_btn.pressed.connect(self._onOpenBtnPressed) 
self.ui_open_btn.triggered.connect(self._onOpenBtnTriggered) 

def _onOpenBtnPressed(self): 
    self.ui_open_btn.showMenu() 

def _onOpenBtnTriggered(self, action): 
    application_name = action.text() 
    # code to launch the application 

,當用戶按下按鈕,會彈出菜單:我實現這個按鈕爲QToolButton和連接信號如下。但是,當用戶釋放按鈕時,菜單仍然存在,並且通過單擊它來觸發菜單上的操作。我在DelayedPopupInstantPopup模式下都嘗試過。只要菜單設置爲self.ui_open_btn,我就不能再捕獲任何released信號。如何在用戶釋放鼠標時隱藏菜單?如何通過釋放鼠標觸發菜單上的操作?

--added ---

我發現了另一個問題,關於使用QToolButton:按下按鈕時,菜單總是彈出。相反,我想抓住pressed信號,做一些檢查以確定菜單是否應該彈出。所以我通過繼承QPushButtonQMenu來改變我的方法來編寫自定義工具按鈕。請參閱下面的答案中提供的代碼。

謝謝。

+0

你有沒有嘗試隱藏使用'released'信號菜單嗎? – mguijarr

+0

@mguijarr:是的,我嘗試過'self.ui_open_btn.menu()。close()'和'self.ui_open_btn.menu()。hide()'。都沒有工作。我認爲問題是,只要菜單已設置爲'self.ui_open_btn',我不能再捕獲任何'釋放'信號。 – user110

回答

0

我設法達到我想要通過繼承QPushButtonQMennu

class MyMenu(QtGui.QMenu): 
    """ Custom menu which will close when mouse is released. ""'" 
    def mouseReleaseEvent(self, event): 
     action = self.actionAt(event.pos()) 
     self.triggered.emit(action) 
     self.close() 

class MyButton(QtGui.QPushButton): 
    triggered = QtCore.pyqtSignal("QAction") 

    def __init__(self, menu=None, parent=None): 
     super(MyButton, self).__init__(parent) 
     self.setMenu(menu) 

    def menu(self): 
     return self._menu 

    def setMenu(self, menu): 
     self._menu = menu if menu else MyMenu(self) 
     self._menu.triggered.connect(self.triggered.emit) 

,並在裝有該按鈕QDialog,我做了以下內容:

menu = MyMenu(self) 
# insert here code to add actions to menu 
self.open_btn = MyButton(parent=self, menu=menu) 
self.open_btn.pressed.connect(self._onOpenBtnPressed) 
self.open_btn.triggered.connect(self._onOpenBtnTriggered) 

def _onOpenBtnPressed(self): 
    # insert here code to check whether we should pop up the menu 
    pos = self.mapToGlobal(self.open_btn.pos()) 
    pos.setY(pos.y() + self.open_btn.height()) 
    self.open_btn.menu().move(pos) 
    self.open_btn.menu().show() 

def _onOpenBtnTriggered(self, action): 
    if action: 
     application_name = str(action.text()) 
     # insert here code to launch this application 
    else: 
     # insert here code to launch the default application 
    self.close() # close this dialog 
0

創建一個自定義QToolButton將從菜單中篩選事件,並通過菜單收到 鼠標釋放事件作出反應:

class MyToolButton(QtGui.QToolButton): 
    def __init__(self, *args): 
     QtGui.QToolButton.__init__(self, *args) 
    def eventFilter(self, menu, event): 
     if event.type() == QtCore.QEvent.MouseButtonRelease: 
      if self.underMouse(): 
       menu.close() 
       # and now do default action 
       print "doing default action" 
       return True 
     return False 

安裝事件過濾器在設置菜單後:

self.ui_open_btn.menu().installEventFilter(self.ui_open_btn) 
+0

我剛試過。它不起作用。 'eventFilter()'根本不被調用。 – user110

+0

您創建了一個MyToolButton,對吧?不是QToolButton。您還必須安裝事件過濾器。請顯示一些代碼。 – mguijarr

+0

是的。我做了:'self.open_btn = MyToolButton(self)'和'self.open_btn.installEventFilter(self.openBtn.menu())'和'MyToolButton'完全像你發佈的內容。 – user110