2016-01-11 134 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

你是对的。我在解释中加了一点点。 –