大家都知道,QTreeWidget每行是通过QTreeWidgetItem来描述的,也就是说如果对Item单独设置属性的话,使得某一行可以编辑或者不可编辑:
QTreeWidgetItem* item = new QTreeWidgetItem(ui.treeWidget);
/// 设置某一行的内容可编辑
item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable);
有时候我们想要用QTreeWidget给用户提供Key-Value的设置界面,要禁止第一列参数名称(key)编辑功能,而Qt没有直接提供列设置功能,而QTreeWidget(还包括其他数据控件,如表格、列表等,简称MV-D)创建编辑器和显示功能是由Delegate提供的。
所以我们可以从Delegate入手,禁用某列编辑功能。
class DisableEditor : public QStyledItemDelegate
{
public:
DisableEditor(QObject* parent)
: QStyledItemDelegate(parent) {}
virtual QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &option,
const QModelIndex &index) const override
{
return 0;
}
};
/// 设置第一列不可编辑
ui.treeWidget->setItemDelegateForColumn(0, new DisableEditor(
ui.treeWidget));