QTableVIew表格数据实时更新时选中行光标消失的解决方法

模型由继承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();

}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值