Коллеги,
поясните, пожалуйста, как правильно задавать пользовательскую роль модели?
Я использую табличную модель MyModel, наследник QAbstractTableModel, для отображения данных - QTableView.
Пользовательская роль мне нужна для использования в делегате, в котором в зависимости от ее значения, создавать разные типы виджетов.
Я предполагал, что все это реализуется следующим образом (в представленном коде я опускаю несущественные места):
модель:
C++ (Qt)
class MyTableModel : public QAbstractTableModel
{
Q_OBJECT
public:
...
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
...
};
C++ (Qt)
bool MyTableModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
if (!index.isValid())
return false;
if (role == Qt::EditRole) {
// FIXME: Implement me!
...
return true;
}
else {
QAbstractTableModel::setData(index, value, role);
return true;
}
return false;
}
делегат:
C++ (Qt)
class CComboDelegate : public QStyledItemDelegate
{
Q_OBJECT
// QAbstractItemDelegate interface
public:
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
...
};
C++ (Qt)
QWidget *CComboDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
int type = index.data(Qt::UserRole);
if(type == 0) {
QComboBox* combo = new QComboBox(parent);
return combo;
} else if(type == 1) {
QLineEdit* edit = new QLineEdit(parent);
return edit;
} else {
return parent;
}
}
задаем пользовательскую роль для 3-ей колонки таблицы, для объекта tableView (QTableView) задаем делегат:
C++ (Qt)
MyTableModel* model = ...;
int column = 2;
for(int i=0; i<model->rowCount(); i++) {
QModelIndex index = model->index(i, column);
model->setData(index, 0, Qt::UserRole);
}
CComboDelegate* delegate = new CComboDelegate(tableView);
tableView->setItemDelegateForColumn(column, delegate);
К сожалению, в CComboDelegate::createEditor данные роли type не определены. Что я не так делаю?