关于qtableview开发过程中的一些记录

使用QTableWidget刷新数据后,经常会自动展示为table首行。为了显示刷新数据前所在的位置,解决办法如下:

   

   先记住滚动条位置,刷新数据后,再重置滚动条位置。

伪代码如下:

QScrollBar *scrollBar = verticalScrollBar();
int barPos = scrollBar->value();

       //refresh

       scrollBar->setValue(barPos);

 

    更好的解决办法:  

  而最好的使用方式为使用QTableView+mode方式,此时更新数据后,当前窗口画面不会自动显示行table中的首行。

QTableView如何获取当前显示的可见行和列的索引?

 

假设一个QTableView的表格,其显示过万个单元格,且这些单元格的值都是些需要实时刷新(如1秒)的值,那么通常的实现就是:定义一个1秒的定时器,定时触发for循环,自第0行0列刷新到第n行n列

但实际上,无论界面大小如何变化,我们始终能看到的都是仅有的最多几十行、十来列而已。如果每次都把所有单元格刷新一遍,耗时且浪费性能,刷新一些看不见的单元格,其实没必要。

那么,怎么才能获取到QTableView的可见范围呢?

即,获取表格中显示的首行、首列,和末行、末列,这样的话,就可以实现可见范围的刷新!注意,不是第0行0列和第n行n列。

目前我的实现如下代码,期待有更好的解决办法:

 

 

在编辑完某个cell之后,更新界面,总默认跳转到界面最顶端,这个很烦人,有时候你加了很多行东西,每次跳转都顶端,还得拉下来,在进行下一次编辑。

跟了一下代码,发现是因为,我更新界面的时候,使用了clear()这个函数,

 

m_pTableWidget->clear(); //清除表中内容,包括标题头


我是每次更新,先clear(),然后又根据数据重刷的界面,而clear()会触发QtableWidget的滚动条的valueChanged()消息,发送的val是0.

 

解决办法:

首先,在每次编辑cell的时候,记录滚动条的位置和最大值,一定要记录最大值!!!

 

  1.  
    //记录当前选中
  2.  
    m_nCurSliderPos = m_pTableWidget->verticalScrollBar()->sliderPosition();
  3.  
    m_nCurSliderMaximum = m_pTableWidget->verticalScrollBar()->maximum();


然后,在更新界面的时候重新set这两个数据,

 

    1.  
      //界面回到之前的位置
    2.  
      m_pTableWidget->verticalScrollBar()->setMaximum(m_nCurSliderMaximum);
    3.  
      if(m_nCurSliderPos>0)
    4.  
      m_pTableWidget->verticalScrollBar()->setValue(m_nCurSliderPos);
    5.  
posted @ 2022-08-27 14:16  eastgeneral  阅读(352)  评论(0编辑  收藏  举报