使用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的可见范围呢?
![](https://pic2.zhimg.com/v2-02992374bcf65058f4863055090aae55_b.jpg)
即,获取表格中显示的首行、首列,和末行、末列,这样的话,就可以实现可见范围的刷新!注意,不是第0行0列和第n行n列。
目前我的实现如下代码,期待有更好的解决办法:
在编辑完某个cell之后,更新界面,总默认跳转到界面最顶端,这个很烦人,有时候你加了很多行东西,每次跳转都顶端,还得拉下来,在进行下一次编辑。
跟了一下代码,发现是因为,我更新界面的时候,使用了clear()这个函数,
m_pTableWidget->clear(); //清除表中内容,包括标题头
我是每次更新,先clear(),然后又根据数据重刷的界面,而clear()会触发QtableWidget的滚动条的valueChanged()消息,发送的val是0.
解决办法:
首先,在每次编辑cell的时候,记录滚动条的位置和最大值,一定要记录最大值!!!
- //记录当前选中
- m_nCurSliderPos = m_pTableWidget->verticalScrollBar()->sliderPosition();
- m_nCurSliderMaximum = m_pTableWidget->verticalScrollBar()->maximum();
然后,在更新界面的时候重新set这两个数据,
- //界面回到之前的位置
- m_pTableWidget->verticalScrollBar()->setMaximum(m_nCurSliderMaximum);
- if(m_nCurSliderPos>0)
- m_pTableWidget->verticalScrollBar()->setValue(m_nCurSliderPos);