如何在组合框PyQ中创建树视图(带复选框)

2024-06-16 11:44:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用PYQT开发应用程序。我的要求是在组合框项中插入带有复选框的树视图。我想知道如何做到这一点?在

我有以下代码,但这不起作用。在

class CheckboxInsideListbox(QWidget):
def __init__(self, parent = None):
    super(CheckboxInsideListbox, self).__init__(parent)
    self.setGeometry(250,250,300,300)
    self.MainUI()

def MainUI(self):
    #stb_label = QLabel("Select STB\'s")
    stb_combobox = QComboBox()

    length = 10
    cb_layout = QVBoxLayout(stb_combobox)
    for i in range(length):
        c = QCheckBox("STB %i" % i)
        cb_layout.addWidget(c)

    main_layout = QVBoxLayout()
    main_layout.addWidget(stb_combobox)
    main_layout.addLayout(cb_layout)



    self.setLayout(main_layout)

如果我有什么遗漏,请告诉我。在


Tags: selfinitmaindeflengthparentcblayout
2条回答

如果你真的想把一个布局应用到一个布局中,试着把你的小部件添加到你的cb_布局中。否则就别再做了。在

您应该创建一个支持Qt.checkstate角色在data和SetData方法中Qt.ItemIsUserCheckable在flags方法中。在

我把我在项目中使用的一个例子粘贴到这里,这是一个QSortFilterProxyModel通用实现,可以在任何模型中使用,但是您可以在模型实现中使用相同的思想,显然我在这个子类中使用内部结构,您没有直接在PyQt中使用,而是附加到我的内部实现中(自布尔集合以及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)

相关问题 更多 >