Добрый день товарищи. Появилась проблема которую не могу решить уже очень долгое время. В общем, у меня есть модель QTableView в которой я хочу в определенном столбце выводить делегат QComboBox. Проблема в том, что не понимаю что нужно возвращать в методе data в столбце где должен быть делегат. Подскажите, что я делаю не так. P.S. Это мой первый большой проект на Qt, так что принимаю любую критику.
Описание делегата.
void MyDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QStyledItemDelegate::paint(painter, option, index);
}
QWidget *MyDelegate::createEditor( QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
if (index.column() == 2)
{
QComboBox *comboBox = new QComboBox(parent);
comboBox->addItems(m_list);
return comboBox;
}
else
{
return QStyledItemDelegate::createEditor(parent, option, index);
}
}
void MyDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
if (index.column() == 2)
{
QComboBox *comboBox = static_cast<QComboBox*>(editor);
int pos = comboBox->findText(index.model()->data(index, Qt::EditRole).toString(), Qt::MatchExactly);
comboBox->setCurrentIndex(pos);
}
else
{
return QStyledItemDelegate::setEditorData(editor, index);
}
}
void MyDelegate::setModelData( QWidget * editor, QAbstractItemModel *model, const QModelIndex& index) const
{
if (index.column() == 2)
{
QComboBox *comboBox = static_cast<QComboBox*>(editor);
QString data = comboBox->currentText();
model->setData(index, data);
}
else
{
return QStyledItemDelegate::setModelData(editor, model, index);
}
}
void MyDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &) const
{
editor->setGeometry(option.rect);
}
Слот, который создает новую заметку в таблице.
bool MainWindow::addDiscip()
{
if (!isTableOpen())
{
QMessageBox::warning(this, "Внимание", tr("Таблица не открыта!"));
return false;
}
AddDiscipDialog discipDlg(this);
discipDlg.setWindowTitle("Дисциплины");
MyDelegate *delegate = new MyDelegate(this);
Note note; // объект который содержит в себе информацию: название, номер семестра, номер курса дисциплины
discipDlg.setNote(¬e);
discipDlg.setDelegate(delegate);
if (discipDlg.exec() != AddDiscipDialog::Accepted)
{
return false;
}
maintable->insert(note);
ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
ui->tableView->setItemDelegateForColumn(2, delegate);
return true;
}
Метод data моей модели.
QVariant MainTable::data(const QModelIndex &index, int role) const
{
if (role == Qt::DisplayRole)
switch (index.column())
{
case 0:
return mMainTable[index.row()].discipname();
case 1:
return mMainTable[index.row()].discipcourse();
case 2:
return ???
}
return QVariant();
}