QTableView批量调整行高刷新效率问题解决

  • 引言
  • 原处理方法
  • 改良后方法

引言

项目中使用model-view模型,当拖拽边框拉伸表格或者最大化最小化时希望能调整显示内容、自适应行高,可是当数据量较大时(最大2w条以上),QTableView刷新卡顿。

原处理方法

简单粗暴,直接拦截窗口调整事件后调整所有行行高:
关于事件管理器可参考前文,自定义QTableView鼠标滚轮行为

void ProtocolTester::resizeEvent(QResizeEvent *event)
{
    if(event->type()==QEvent::Resize)//QEvent::WindowStateChange
        ui_NetWork.tableView_Exchange->resizeRowsToContents();
}

改良后方法

拖拽边框时仅调整当前显示界面的行高,解决了数据量大时批量调整的卡顿问题,界面又如丝般顺滑。

声明辅助变量

    int ExchangeTableView_firstRow;//记录当前报文交互界面第一行的行号
    int ExchangeTableView_lastRow;//记录当前报文交互界面最后一行的行号

窗口大小调整时,动态调整行高

void ProtocolTester::resizeEvent(QResizeEvent *event)
{

    if(event->type()==QEvent::Resize)//QEvent::WindowStateChange
    {
        int tableHeight=ui_NetWork.tableView_Exchange->height();
        int firstRow=ui_NetWork.tableView_Exchange->rowAt(0);
        int lastRow=ui_NetWork.tableView_Exchange->rowAt(tableHeight-30);//最后一行显示边界比整个高度略小,减掉一个调整量,确保取到最后一行的行号

        for (int i=firstRow;i<=lastRow;i++)
        {
            //当有新行进入视野被显示时(超出当前范围),调整该行行高
            if (i<ExchangeTableView_firstRow || i>ExchangeTableView_lastRow )
            {
                ui_NetWork.tableView_Exchange->resizeRowToContents(i);
            }
        }
        ExchangeTableView_firstRow = firstRow;//更新当前显示范围
        ExchangeTableView_lastRow = lastRow;
    }

}

同理,当滑动鼠标滑标或者拖动ScrollBar时调整当前显示界面的行高。

你可能感兴趣的:(Qt)