我正在使用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)
如果我在这里丢失任何东西,请告诉我。
答案 0 :(得分:0)
如果您真的想将布局应用于布局,请尝试将小部件添加到cb_layout。否则摆脱你的子布局。
答案 1 :(得分:0)
您应该在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)