2016-01-11 174 views
2

我有一個菜單QToolButton。點擊QToolButton時,出現菜單。默認行爲是,當從菜單中點擊一個動作時,菜單消失。我怎樣才能讓菜單保持打開狀態,直到用戶點擊其他地方?保持菜單打開後點擊它啓動的按鈕

這裏是最少的代碼顯示的行爲:

from PyQt4 import QtGui, QtCore 
import sys, os 

if __name__ == '__main__': 
    app = QtGui.QApplication(sys.argv) 
    toolButton = QtGui.QToolButton() 
    toolButton.setText('Select') 
    toolMenu = QtGui.QMenu() 
    for i in range(3): 
     action = toolMenu.addAction(str(i)) 
     action.setCheckable(True) 
    toolButton.setMenu(toolMenu) 
    toolButton.setPopupMode(QtGui.QToolButton.InstantPopup) 
    toolButton.show() 
    sys.exit(app.exec_()) 
+0

您可以通過[QWidgetAction](https://doc.qt.io/qt-4.8/qwidgetaction.html)實現此目的。 – ekhumoro

回答

1

無恥地從this移植的代碼C++回答:

from PyQt4 import QtGui, QtCore 
import sys, os 

if __name__ == '__main__': 
    app = QtGui.QApplication(sys.argv) 
    toolButton = QtGui.QToolButton() 
    toolButton.setText('Select') 
    toolMenu = QtGui.QMenu() 
    for i in range(3):  
     checkBox = QtGui.QCheckBox(str(i), toolMenu) 
     checkableAction = QtGui.QWidgetAction(toolMenu) 
     checkableAction.setDefaultWidget(checkBox) 
     toolMenu.addAction(checkableAction) 
    toolButton.setMenu(toolMenu) 
    toolButton.setPopupMode(QtGui.QToolButton.InstantPopup) 
    toolButton.show() 
    sys.exit(app.exec_()) 
+0

謝謝,那正是我正在尋找的。 – jmizrahi

0

我設法找到了最簡單的解決方案是讓一個除了actionEvent

class myMenu(QtGui.QMenu): 
    def actionEvent(self, event): 
     super().actionEvent(event) 
     self.show() 
0

我一直在尋找FO完全一樣的東西,並使用three_pineapples的代碼,但我無法按照我想要的方式連接它。我想我會分享我的解決方案,以防其他人發現它有用。 按鈕功能非常相似,但我的代碼包含了用於將複選框連接到函數的解決方案。而且,由於它們存儲在列表中,因此如果更容易,可以將它們分別連接或循環連接。

from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
import sys, os 

##### main window class ##### 
class main_window(QMainWindow): 
    def __init__(self): 
     super(main_window, self).__init__() 
     self.resize(300, 200) 

     wdgMain = QWidget() 
     self.setCentralWidget(wdgMain) 
     layMain = QGridLayout(wdgMain) 
     wdgMain.setLayout(layMain) 

     ## checkable tool button ## 
     tlbToolButton1 = QToolButtonChx("Check Me Out!") 
     layMain.addWidget(tlbToolButton1, 0, 0) 
     tlbToolButton1.addItems(["Item" + str(n) for n in range(8)]) 

     ## connect tool button checkboxes ## 
     for i in range(tlbToolButton1.length()): 
      tlbToolButton1.index(i).stateChanged.connect(self.checkbox_tester) 

    def checkbox_tester(self, choice): 
     objSender = self.sender() 
     strObjectName = objSender.objectName() 
     print "Action Checker::", strObjectName, ":", choice 
##### end of main window class ##### 



##### checkable tool button class ##### 
class QToolButtonChx(QToolButton): 
    def __init__(self, strText=""): 
     super(QToolButtonChx, self).__init__() 

     self.setText(strText) 
     tlbMenu = QMenu(self) 
     self.setMenu(tlbMenu) 
     self.setPopupMode(QToolButton.MenuButtonPopup) 
     self.lstchxItems = [] 

    def addItem(self, strItem): 
     self.lstchxItems.append(QCheckBox(strItem, self.menu())) 
     actCheckItem = QWidgetAction(self.menu()) 
     actCheckItem.setDefaultWidget(self.lstchxItems[-1]) 
     self.lstchxItems[-1].setObjectName('chx' + strItem) 
     self.menu().addAction(actCheckItem) 

    def addItems(self, lstItems): 
     for strItem in lstItems: 
      self.lstchxItems.append(QCheckBox(strItem, self.menu())) 
      actCheckItem = QWidgetAction(self.menu()) 
      actCheckItem.setDefaultWidget(self.lstchxItems[-1]) 
      self.lstchxItems[-1].setObjectName('chx' + strItem) 
      self.menu().addAction(actCheckItem) 

    def index(self, intIndex): 
     return self.lstchxItems[intIndex] 

    def length(self): 
     return len(self.lstchxItems) 
##### end of checkable tool button class ##### 


if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    winMain = QMainWindow() 
    gui = main_window() 
    gui.show() 
    sys.exit(app.exec_()) 
+1

您可以解釋您的解決方案與其他解決方案的區別。 – eyllanesc

+0

你是對的。我在解釋中加了一點點。 –