PyQt:如何将组合框项目设置为可检查?
为了将GUI窗口小部件的数量保持在最低水平,我需要找到一种方法让用户选择下拉菜单项,这些菜单项可用于过滤listWidget项中显示的内容。假设listWidget列出了5种不同的项目类别:“猫A”,“猫B”,“猫C”,“猫D”,“猫E”。我可以为每个商品类别实现单选或复选框。但是5个单选按钮或复选框会占用大量GUI空间。带有可检查项的组合框似乎是正确的选择。有任何想法吗?
from PyQt4 import QtGui, QtCore
import sys, os
class CheckableComboBox(QtGui.QComboBox):
def __init__(self):
super(CheckableComboBox, self).__init__()
def flags(self, index):
return Qt.ItemIsUserCheckable | Qt.ItemIsSelectable | Qt.ItemIsEnabled
class Dialog_01(QtGui.QMainWindow):
def __init__(self):
super(QtGui.QMainWindow,self).__init__()
myQWidget = QtGui.QWidget()
myBoxLayout = QtGui.QVBoxLayout()
myQWidget.setLayout(myBoxLayout)
self.setCentralWidget(myQWidget)
self.ComboBox = CheckableComboBox()
for i in range(3):
self.ComboBox.addItem("Combobox Item " + str(i))
myBoxLayout.addWidget(self.ComboBox)
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
dialog_1 = Dialog_01()
dialog_1.show()
dialog_1.resize(480,320)
sys.exit(app.exec_())
-
关于多选组合的想法是在之前提出的,但是我不确定它是否是最佳解决方案。确实,所需要的只是一个带有下拉菜单的工具按钮(类似于网络浏览器中的历史记录按钮)。
这是示例的更新,说明了两个选项:
from PyQt4 import QtGui, QtCore import sys, os class CheckableComboBox(QtGui.QComboBox): def __init__(self): super(CheckableComboBox, self).__init__() self.view().pressed.connect(self.handleItemPressed) self.setModel(QtGui.QStandardItemModel(self)) def handleItemPressed(self, index): item = self.model().itemFromIndex(index) if item.checkState() == QtCore.Qt.Checked: item.setCheckState(QtCore.Qt.Unchecked) else: item.setCheckState(QtCore.Qt.Checked) class Dialog_01(QtGui.QMainWindow): def __init__(self): super(QtGui.QMainWindow,self).__init__() myQWidget = QtGui.QWidget() myBoxLayout = QtGui.QVBoxLayout() myQWidget.setLayout(myBoxLayout) self.setCentralWidget(myQWidget) self.ComboBox = CheckableComboBox() for i in range(3): self.ComboBox.addItem("Combobox Item " + str(i)) item = self.ComboBox.model().item(i, 0) item.setCheckState(QtCore.Qt.Unchecked) self.toolbutton = QtGui.QToolButton(self) self.toolbutton.setText('Select Categories ') self.toolmenu = QtGui.QMenu(self) for i in range(3): action = self.toolmenu.addAction("Category " + str(i)) action.setCheckable(True) self.toolbutton.setMenu(self.toolmenu) self.toolbutton.setPopupMode(QtGui.QToolButton.InstantPopup) myBoxLayout.addWidget(self.toolbutton) myBoxLayout.addWidget(self.ComboBox) if __name__ == '__main__': app = QtGui.QApplication(sys.argv) dialog_1 = Dialog_01() dialog_1.show() dialog_1.resize(480,320) sys.exit(app.exec_())