2016-08-19 2 views
0

У меня уже есть QTreeView с собственной моделью и делегатом, который может показать QComboBox в одном столбце этого QTreeView.Показать QComboBox (через Делегат) только в некоторых конкретных ячейках?

Теперь в зависимости от данных, отображаемых в дереве, QComboBox должен быть включен и активирован только для некоторых из ячеек, а не для полного столбца. Я уже обнаружил, что QComboBox не отображается и не обрабатывается, когда функция делегата createEditor() возвращает NULL. Но: createEditor() не поставляется со ссылкой на модель, поэтому я не могу запросить его для данного индекса, если QCombobox должен быть показан или нет. С другой стороны, я не могу хранить связанную информацию в делегате (потому что она является общей, и такое решение будет нарушать разделение между представлением и данными IMHO).

Итак: как я могу получить доступ к модели из createEditor() или какие другие возможности мне нужно скрыть делегированный QComboBox динамически для некоторых ячеек моего QTreeView?

Спасибо!

ответ

3

Вы можете получить модель из QModelIndex

QWidget * createEditor(QWidget * parent, const QStyleOptionViewItem & option, const QModelIndex & index) const 
{ 
    const QAbstractItemModel * model = index.model(); 
    //..... 
} 

Итак, вы оба индекса и модель, и я думаю, достаточно, чтобы определить, есть ли создать выпадающий или нет.

Из вопроса не ясно, должны ли другие ячейки быть доступны для редактирования другим виджетами. Если это не так, вы можете просто сделать ячейки недоступными для редактирования, вернув правильные флаги в вашей модели (включите Qt::ItemIsEditable только для редактируемых ячеек.) См. QAbstractItemModel::flags

Смежные вопросы