我有一个QTableView
,其中包含4行和4列,分别代表其中的数据。默认情况下,QTableView
是可编辑的。现在,我想在QTableView
中将任何特定列设置为不可编辑。
我该怎么办?
先谢谢。
答案 0 :(得分:8)
您可以使用setItemDelegateForColumn()
功能。实现只读委托,并为您需要的列设置它。
您还可以在模型中使用the flags,并删除特定列的Qt::ItemIsEditable
标记。
答案 1 :(得分:6)
这样的事情也可能会这样做:
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));
}
答案 2 :(得分:1)
可能会迟到,但供将来参考。您应该将表格视图设置为NoEditTrigger
,如下所示:
myTableView->setModel(model);
myTableView->setEditTriggers(QAbstractItemView::NoEditTriggers)
答案 3 :(得分:0)
在覆盖方法中,只需将其更改为if(!(index.column() == 0)
,然后将Flag
值更改为Flag |= Qt::ItemisEditable
。
此工作正常。
答案 4 :(得分:0)
您需要覆盖'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;
}