2012-09-27 46 views

Respuesta

7

Puede usar la función setItemDelegateForColumn(). Implemente un delegado de solo lectura y configúrelo para la columna que necesita.

También puede usar the flags dentro de su modelo y quitar la bandera Qt::ItemIsEditable para una columna específica.

+0

Cómo implementar un delegado de solo lectura. ¿Algún ejemplo? – oya163

0

En el método alternativo simplemente cámbielo a if(!(index.column() == 0) y cambie el valor Flag como Flag |= Qt::ItemisEditable.
Esto funciona bien.

+0

Supongo que querías reemplazar 'bool QAbstractItemView :: edit (const QModelIndex & index, EditTrigger trigger, QEvent * event)' ¿verdad? En tal caso, simplemente puede devolver 'false' para la columna de solo lectura. –

1

Puede ser tan tarde, pero para referencia futura. Se debe ajustar la vista de tabla a NoEditTrigger así:

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

Guau, esa es la solución más limpia que he visto hasta ahora, especialmente si solo quiere que los datos sean de solo lectura en _una_ de sus vistas en el mismo modelo. ¡Gracias! –

+4

Pero, ¿cómo se puede aplicar este método a una única columna o fila, como pregunta OP? –

5

Algo así como que también pueden hacerlo:

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

}; 

En uso:

// 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

La forma más fácil es settting la bandera del artículo que no desea que se pueda editar de esta manera:

item->setFlags(item->flags() & ~Qt::ItemIsEditable); 

También puede consultar este hilo: Qt How to make a column in QTableWidget read only

Cuestiones relacionadas