Может подойдет такой способ:
Использую для комбобокс делегата QItemDelegate, переопределяю createEditor
QWidget *sAlignDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem& /* option */, const QModelIndex& /* index */) const
{
QComboBox *editor = new QComboBox(parent);
editor->addItem(tr("Left"), 1);
editor->addItem(tr("Right"), 2);
editor->addItem(tr("Center"), 4);
editor->installEventFilter(const_cast<sAlignDelegate *>(this));
return editor;
}
переопределяю setEditorData, куда передаю текущее значение из модели:
void sAlignDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
int value = index.model()->data(index, Qt::EditRole).toInt();
QComboBox *combo = static_cast<QComboBox*>(editor);
combo->setCurrentIndex(combo->findData(value));
connect(editor, SIGNAL(currentIndexChanged(int)), this, SLOT(indexChanged(int)));
}
когда меняю значение в комбобоксе, отправляю сигнал о смене значение.
void sAlignDelegate::indexChanged(int idx)
{
emit currentDataChanged(idx);
}
А когда теряется фокус, отрабатывает переопределенный setModelData
void sAlignDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex& index) const
{
QComboBox *combo = static_cast<QComboBox*>(editor);
int value = combo->itemData(combo->currentIndex()).toInt();
model->setData(index, value);
}
и соответственно только тогда отрабатывает dataChanged