模型由继承QAbstractItemModel重写实现,在数据更新前先记录选中行,数据更新后,重新设置选中行
class Model : public QAbstractItemModel
{
Q_OBJECT
public:
Model( );
~Model();
int rowCount(const QModelIndex &parent = QModelIndex()) const;
virtual int columnCount(const QModelIndex &parent = QModelIndex()) const;
public slots:
void refresh();
};
void Model::refresh()
{
reset();
}
class TableView : public QTableView
{
Q_OBJECT
public:
TableView (QWidget *parent = 0);
~ TableView ();
void backup_select();
void restore_select(bool scroll = false);
protected:
//用来记录选中行
int _select_row;
};
记录选中行
void TableView::backup_select()
{
QItemSelectionModel *m = selectionModel();
if( !m ) return ;
QModelIndexList lst = m->selectedRows();
if( lst.isEmpty() ) {
_select_row = -1;
return;
}
_select_row = lst[0].row();
}
重新设置选中行
void TableView::restore_select(bool scroll )
{
QItemSelectionModel *m = this->selectionModel();
if( _select_row < 0 || !m ) {
return ;
}
m->clearSelection();
QItemSelection _select ;
QModelIndex left = m_Model->index(_select_row,0);
QModelIndex end = m_Model->index(_select_row,m_Model->columnCount() - 1);
_select.select(left,end);
m->select(_select,QItemSelectionModel::Select);
if( scroll ) {
scrollTo(left,QAbstractItemView::PositionAtCenter);
}
}
更新数据
void TableView::refresh()
{
backup_select();
m_Model->refresh(); //m_Model为Model类型
restore_select();
}