我需要实现一个包含CheckBoxes的下拉列表,就像ComboBox中的条目是CheckBoxes一样。但是QComboBox不接受QCheckBox作为其成员,我找不到任何替代解决方案。我在Qt Wiki的C ++中found an implementation,但不知道如何将它移植到python。
答案 0 :(得分:5)
当我需要这个时,我想出了一个更简单的解决方案(至少没有必要将QCombobox子类化)。它对我有用。 这是创建一个带有可检查操作的菜单,并将其设置为一个按钮。然后将菜单或操作连接到插槽。
Qt中的代码(还没有使用PyQt,对不起,我希望你可以移植那个,对我来说似乎更容易)是这样的:
QMenu *menu = new QMenu;
QAction *Act1 = new QAction("Action 1", menu);
Act1->setCheckable(true);
QAction *Act2 = new QAction("Action 2", menu);
Act2->setCheckable(true);
menu->addAction(Act1);
menu->addAction(Act2);
QPushButton *btn = new QPushButton("Btn");
btn->setMenu(menu);
希望这有帮助
答案 1 :(得分:2)
我在How do I create a tree view (with checkbox) inside a combo box - PyQt回复了类似的问题,但无论如何,为了完整回复,我会将您粘贴到此处:
您应该在flags和SetData方法中创建一个支持Qt.CheckStateRole的模型,并在flags方法中创建一个Qt.ItemIsUserCheckable标志。
我在这里粘贴你在项目中使用的一个例子,这是一个QSortFilterProxyModel通用实现,可以在任何模型中使用,但你可以在模型实现中使用相同的想法,显然我在你使用的子类中使用内部结构不直接在PyQt中并附加到我的内部实现(self.booleanSet和self.readOnlySet)。
def flags(self, index):
if not index.isValid():
return Qt.ItemIsEnabled
if index.column() in self.booleanSet:
return Qt.ItemIsUserCheckable | Qt.ItemIsSelectable | Qt.ItemIsEnabled
elif index.column() in self.readOnlySet:
return Qt.ItemIsSelectable | Qt.ItemIsEnabled
else:
return QSortFilterProxyModel.flags(self, index)
def data(self, index, role):
if not index.isValid():
return QVariant()
if index.column() in self.booleanSet and role in (Qt.CheckStateRole, Qt.DisplayRole):
if role == Qt.CheckStateRole:
value = QVariant(Qt.Checked) if index.data(Qt.EditRole).toBool() else QVariant(Qt.Unchecked)
return value
else: #if role == Qt.DisplayRole:
return QVariant()
else:
return QSortFilterProxyModel.data(self, index, role)
def setData(self, index, data, role):
if not index.isValid():
return False
if index.column() in self.booleanSet and role == Qt.CheckStateRole:
value = QVariant(True) if data.toInt()[0] == Qt.Checked else QVariant(False)
return QSortFilterProxyModel.setData(self, index, value, Qt.EditRole)
else:
return QSortFilterProxyModel.setData(self, index, data, role)
答案 2 :(得分:2)
使用Combobox项目模型,因为项目支持checkBoxes 你只需要将项目标记为可由用户检查,并设置一个初始checkState以使checkBox出现(它只显示是否存在有效状态)
item.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled)
item.setCheckState(QtCore.Qt.Unchecked) # causes checkBox to show
这是一个最小的子类示例:
from PyQt5 import QtGui, QtCore, QtWidgets
import sys, os
# subclass
class CheckableComboBox(QtWidgets.QComboBox):
# once there is a checkState set, it is rendered
# here we assume default Unchecked
def addItem(self, item):
super(CheckableComboBox, self).addItem(item)
item = self.model().item(self.count()-1,0)
item.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled)
item.setCheckState(QtCore.Qt.Unchecked)
def itemChecked(self, index):
item = self.model().item(i,0)
return item.checkState() == QtCore.Qt.Checked
# the basic main()
app = QtWidgets.QApplication(sys.argv)
dialog = QtWidgets.QMainWindow()
mainWidget = QtWidgets.QWidget()
dialog.setCentralWidget(mainWidget)
ComboBox = CheckableComboBox(mainWidget)
for i in range(6):
ComboBox.addItem("Combobox Item " + str(i))
dialog.show()
sys.exit(app.exec_())