我有一个
QTableView
,有 4 行和 4 列,每行代表其中的数据。默认情况下,QTableView
是可编辑的。现在,我想在我的 QTableView
中将任何特定列设置为不可编辑。
我该怎么做?
setItemDelegateForColumn()
功能。实现一个只读委托,并将其设置为您需要的列。
您还可以在模型中使用 the flags,并删除特定列的
Qt::ItemIsEditable
标志。
类似的事情也可以做到:
class NotEditableDelegate : public QItemDelegate
{
Q_OBJECT
public:
explicit NotEditableDelegate(QObject *parent = 0)
: QItemDelegate(parent)
{}
protected:
bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
{ return false; }
QWidget* createEditor(QWidget *, const QStyleOptionViewItem &, const QModelIndex &) const
{ return Q_NULLPTR; }
};
使用中:
// Make all the columns except the second read only
for(int c = 0; c < view->model()->columnCount(); c++)
{
if(c != 1)
view->setItemDelegateForColumn(c, new NotEditableDelegate(view));
}
最简单的方法是设置您不想以这种方式编辑的项目的标志:
item->setFlags(item->flags() & ~Qt::ItemIsEditable);
您还可以查看此线程:Qt 如何使 QTableWidget 中的列只读
可能会这么晚,但仅供将来参考。您应该将表格视图设置为
NoEditTrigger
,如下所示:
myTableView->setModel(model);
myTableView->setEditTriggers(QAbstractItemView::NoEditTriggers)
在覆盖方法中,只需将其更改为
if(!(index.column() == 0)
并将 Flag
值更改为 Flag |= Qt::ItemisEditable
。您需要覆盖'flags'方法并指定所选列的元素的可编辑性参数
Qt::ItemFlags TableModel::flags(const QModelIndex &index) const
{
if(!index.isValid())
return Qt::NoItemFlags;
if(index.column() == SELECTED_COLUMN_NUM)
{
return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
}
return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable;
}