QTreeView复选框
答
首先,你需要修改TreeItem保持选中状态的轨迹:
private:
...
bool checked;
和setter和getter:
bool isChecked() const { return checked; }
void setChecked(bool set) { checked = set; }
现在,该模型将需要被如此修改该视图知道检查状态:
QVariant TreeModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
TreeItem *item = static_cast<TreeItem*>(index.internalPointer());
if (role == Qt::CheckStateRole && index.column() == 0)
return static_cast<int>(item->isChecked() ? Qt::Checked : Qt::Unchecked);
if (role != Qt::DisplayRole)
return QVariant();
return item->data(index.column());
}
并修改模型的标记方法以允许意见知道该模型包含可检查项目:
Qt::ItemFlags TreeModel::flags(const QModelIndex &index) const
{
if (!index.isValid())
return 0;
Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable;
if (index.column() == 0)
flags |= Qt::ItemIsUserCheckable;
return flags;
}
我认为这应该做到这一点。如果您希望能够在用户勾选并取消选中项目时更新TreeItem检查状态,则需要在您的TreeModel中提供QAbstractItemModel :: setData方法。
答
为了我自己的目的,我将上面的代码转换成了PyQt,并且我想分享一下。
def data(self, index, role):
if not index.isValid():
return None
item = index.internalPointer();
if role == Qt.CheckStateRole and index.column() == self.check_col:
return int(Qt.Checked if item.isChecked() else Qt.Unchecked)
return super(TreeModel, self).data(index, role)
def flags(self, index):
if not index.isValid():
return None
if index.column() == self.check_col:
flags = Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsUserCheckable
else:
flags = super(TreeModel, self).flags(index)
return flags
def setData(self, index, value, role=Qt.EditRole):
if index.column() == self.check_col:
if role == Qt.EditRole:
return False
if role == Qt.CheckStateRole:
item = self.getItem(index)
item.setChecked(value)
self.dataChanged.emit(index, index)
return True
return super(TreeModel, self).setData(index, value, role)
+0
旧线程,但有没有机会分享全班? – atomSmasher
答
下面是使用QStandardItemModel
另一个PyQt的完整沃金例如:
model = QStandardItemModel()
parent_item = model.invisibleRootItem() # type: QStandardItem
for row in [
(Qt.Unchecked, 'unchecked'),
(Qt.PartiallyChecked, 'partially'),
(Qt.Checked, 'checked')
]:
checked, text = row
check_item = QStandardItem('')
check_item.setCheckable(True)
check_item.setCheckState(checked)
parent_item.appendRow([check_item, QStandardItem(text)])
treeview.setModel(model)
顺便说一句,这也应该为任何C++应用程序。
非常酷!正是我在找什么。然而,我发现我应该使用TreeWidget来创建我想要的东西。然而,非常感谢你的职位。 – Drise
不是我可以提出更好的解决方案atm,但布尔值当然缺乏令人敬畏的TRISTATENESS。 (f.e.对于部分选定的文件夹) – eMPee584