2014-10-28 5 views
1

У меня есть QTableView на основе QStandardItemModel. Я хочу установить первый столбец как «только для чтения» и все остальные столбцы для редактирования.QTableView - установить первый столбец как «только для чтения»

Я не эксперт QT и OOP, я искал в Интернете и в QT-документации, и я понимаю, что мне нужно переопределить флаги (const QModelIndex & index) функции моей модели, но Я не знаю, как и где происходит повторная реализация.

Заранее благодарен!

+1

так что у вас есть? – SBH

+0

Я думаю, что повторная реализация должна выглядеть так: if (index.column() == 1) { return QAbstractModel :: flags() & ~ Qt :: ItemIsEditable; } Но я не знаю, куда положить этот кусок кода. – splunk

ответ

4

Вы должны создать новый класс, унаследованный от QStandardItemModel, метод переопределения flags и использовать новый класс вместо стандартного.

class MyModel : public QStandardItemModel 
{ 
public: 
    virtual Qt::ItemFlags flags(const QModelIndex& index) const override 
    { 
     Qt::ItemFlags result = QStandardItemModel::flags(index); 
     if (index.column() == 0) //0 is the first column! 
     { 
      result &= ~Qt::ItemIsEditable; 
     } 
     return result; 
    } 
} 

Другой способ сделать то же самое:
- создать новый класс, унаследованный от QStandardItem,
- переописать flags таким же образом
- называют QStandardItemModel::setItemPrototype с экземпляром нового класса
Этот путь немного сложнее, потому что вам также потребуется переопределить метод QStandardItem::clone.

+0

Вы имеете в виду 'result | = ~ Qt :: ItemIsEditable;'? Я думаю, что оператор OR - это то, что мы ищем – sami1592

+0

@ sami1592 no, мы должны удалить флаг «editable». '| =' будет включать все флаги – Ezee