【发布时间】:2012-09-18 22:23:22
【问题描述】:
我有一个QTableView,其中有 4 行和 4 列,每列代表他们的数据。默认情况下,QTableView 是可编辑的。现在我想在我的QTableView 中将任何特定列设为不可编辑。
我该怎么做?
提前致谢。
【问题讨论】:
标签: c++ qt delegates qtableview qt4.7
我有一个QTableView,其中有 4 行和 4 列,每列代表他们的数据。默认情况下,QTableView 是可编辑的。现在我想在我的QTableView 中将任何特定列设为不可编辑。
我该怎么做?
提前致谢。
【问题讨论】:
标签: c++ qt delegates qtableview qt4.7
您可以使用setItemDelegateForColumn() 函数。实现一个只读委托,并将其设置为您需要的列。
您还可以在模型中使用 the flags,并删除特定列的 Qt::ItemIsEditable 标志。
【讨论】:
在覆盖方法中,只需将其更改为if(!(index.column() == 0) 并将Flag 的值更改为Flag |= Qt::ItemisEditable。
这可以正常工作。
【讨论】:
bool QAbstractItemView::edit(const QModelIndex & index, EditTrigger trigger, QEvent * event) 不是吗?在这种情况下,您可以只为只读列返回false。
可能会这么晚,但供将来参考。您应该像这样将表格视图设置为NoEditTrigger:
myTableView->setModel(model);
myTableView->setEditTriggers(QAbstractItemView::NoEditTriggers)
【讨论】:
类似的东西也可以做到:
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));
}
【讨论】:
index.colum() 返回 false 并没有停止编辑。
最简单的方法是以这种方式设置您不想编辑的项目的标志:
item->setFlags(item->flags() & ~Qt::ItemIsEditable);
你也可以查看这个帖子:Qt How to make a column in QTableWidget read only
【讨论】:
您需要覆盖 '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;
}
【讨论】: