Проблему решил. Если кому понадобиться:
1. Создал свой класс от QTableView.
2. Переопределил функцию setModel
3. Определил функции rowsAboutToBeRemove и rowsInsert
4. В setModel подключил сигналы модели rowsAboutToBeRemoved и rowsInserted к слотам rowsAboutToBeRemove и rowsInsert соответственно ДО передачи модели в QTableView::setModel
5. В функции rowsAboutToBeRemove сохранил текущую позицию
6. В функции rowsInsert вернул старую позицию
qmytableview.h
class QMyTableView: public QTableView
{
Q_OBJECT
public:
QMyTableView(QWidget *parent = 0);
~QMyTableView();
void setModel(QAbstractItemModel *model);
public Q_SLOTS:
void rowsAboutToBeRemove(const QModelIndex & parent, int start, int end);
void rowsInsert(const QModelIndex & parent, int start, int end);
private:
QModelIndex m_index;
};
qmytableview.cpp
QMyTableView::QMyTableView(QWidget *parent)
: QTableView(parent)
{
}
~QMyTableView::QMyTableView()
{
}
void QMyTableView::setModel(QAbstractItemModel *model)
{
if (model == QTableView::model())
return;
if(QTableView::model()){
QAbstractItemModel *model = QTableView::model();
disconnect(model, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),
this, SLOT(rowsAboutToBeRemove(QModelIndex,int,int)));
disconnect(model, SIGNAL(rowsInserted(QModelIndex,int,int)),
this, SLOT(rowsInsert(QModelIndex,int,int)));
}
connect(model, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),
this, SLOT(rowsAboutToBeRemove(QModelIndex,int,int)));
connect(model, SIGNAL(rowsInserted(QModelIndex,int,int)),
this, SLOT(rowsInsert(QModelIndex,int,int)));
QTableView::setModel(model);
}
void QMyTableView::rowsAboutToBeRemove(const QModelIndex & parent, int start, int end)
{
m_index = currentIndex();
}
void QMyTableView::rowsInsert(const QModelIndex & parent, int start, int end)
{
setCurrentIndex(model()->index(m_index.row(), m_index.column()));
}