2012-09-27 31 views

Odpowiedz

7

Można użyć funkcji setItemDelegateForColumn(). Wdróż delegata tylko do odczytu i ustaw go na kolumnę, której potrzebujesz.

Możesz również użyć modelu the flags w swoim modelu i usunąć flagę Qt::ItemIsEditable dla konkretnej kolumny.

+0

Jak zaimplementować delegata tylko do odczytu. Dowolny przykład? – oya163

0

W metodzie overide po prostu zmień wartość na if(!(index.column() == 0) i zmień wartość Flag jako Flag |= Qt::ItemisEditable.
To działa dobrze.

+0

Chyba chodziło Ci o przesłonięcie 'bool QAbstractItemView :: edit (const QModelIndex & index, trigger Trigger, zdarzenie QEvent *), prawda? W takim przypadku możesz po prostu zwrócić 'false' dla kolumny tylko do odczytu. –

1

Może być za późno, ale na przyszłość. należy ustawić widok tabeli do NoEditTrigger tak:

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

Wow, to najczystsze rozwiązanie, jakie dotychczas widziałem, zwłaszcza jeśli chcesz, aby dane były tylko do odczytu w jednym z twoich poglądów na ten sam model. Dzięki! –

+4

Ale w jaki sposób można zastosować tę metodę do pojedynczej kolumny lub wiersza, tak jak pyta OP? –

5

Coś w tym może też to zrobić:

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

}; 

W użyciu:

// 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)); 
} 
Powiązane problemy