2012-09-27 257 views

回答

0

在替代方法中,将其更改为if(!(index.column() == 0)并将Flag的值更改为Flag |= Qt::ItemisEditable
这工作正常。

+0

我想你的意思是重写'bool QAbstractItemView :: edit(const QModelIndex&index,EditTrigger trigger,QEvent * event)'不是吗? 在这种情况下,您只需将'false'返回为只读列。 –

1

可能会迟到,但以备参考。你应该表视图设置为NoEditTrigger这样的:

myTableView->setModel(model); 
myTableView->setEditTriggers(QAbstractItemView::NoEditTriggers) 
+0

哇,这是我见过的最干净的解决方案,特别是如果您只希望数据在同一模型的视图中是只读的。谢谢! –

+4

但是,OP如何要求,如何将这种方法应用于单列或单行? –

5

类似的东西也可以做到这一点:

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)); 
}