Может подойдет такой способ:
Использую для комбобокс делегата 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