2024-06-16 17:36:05 发布
网友
我知道这已经被问了很多次了,但我似乎找不到任何相关的东西。
使用Qt附带的the simpletreemodel tutorial,如何添加复选框?
我把上面的转换成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)
首先,您需要修改TreeItem以跟踪选中的状态:
private: ... bool checked;
还有一个二传手和接球手:
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()); }
并修改模型的flags方法,让视图知道模型包含可检查项:
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 check状态,则需要在TreeModel中提供qabstracttemmodel::setData方法。
下面是另一个使用^{}的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)
我把上面的转换成PyQt是为了我自己的目的,我想我会分享。
首先,您需要修改TreeItem以跟踪选中的状态:
还有一个二传手和接球手:
现在需要修改模型,以便视图了解检查状态:
并修改模型的flags方法,让视图知道模型包含可检查项:
我想应该这样做。如果希望在用户勾选和取消勾选项时能够更新TreeItem check状态,则需要在TreeModel中提供qabstracttemmodel::setData方法。
下面是另一个使用^{} 的PyQt完整工作示例:
相关问题 更多 >
编程相关推荐