繁体   English   中英

使用PyQt在Combobox中的复选框

[英]Checkboxes in a Combobox using PyQt

我需要实现一个包含CheckBoxes的下拉列表,就像ComboBox中的条目是CheckBoxes一样。 但是QComboBox不接受QCheckBox作为其成员,我找不到任何替代解决方案。 我在Qt Wiki上找到了 C ++ 的实现 ,但不知道如何将它移植到python。

当我需要这个时,我想出了一个更简单的解决方案(至少没有必要将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);

希望这可以帮助

使用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_())

我在如何在组合框中创建树视图(带复选框)回复了一个类似的问题- PyQt ,但无论如何,为了完整性我在这里粘贴你:

您应该创建一个支持数据和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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM