QTableView优化的几点经验

之前也参考了其他博客的优化技巧,在此总结一下,其实大多数时候我使用QTableWidget,很少使用QTableView,但是高度定制表格还是使用QTableView,这里使用QStandardItemModel标准模型,关于优化:

1.不要new QStandardItem然后tableModel->setItem,让框架自己管理对象,应该使用:

    tableModel->setRowCount(row);
    tableModel->setColumnCount(column);

这样model里面会自己new,你只需要setData

tableModel->setData(tableModel->index(r, c), "", Qt::EditRole);//效率提升很大

2.->setModel(tableModel);之后再调用setColumnWidth才会有效

3.使用->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);//优化

不要设置resizetocontent,因为高速刷新表格时效率很低,框架内部不断在移动item位置

除此之外,还可以设置->setSelectionMode(QAbstractItemView::NoSelection);

或者->setFocusPolicy(Qt::NoFocus);提高效率,这样框架内部应该不会响应事件,减少代码调用

4.使用代理滚动条,并对垂直滚动条事件进行处理,把QTableView自带的滚动条隐藏掉,并且设置tableModel的条数与QTableView视口的行数对应,不管你的数据有几百万行还是几千万行,我只展示视口能看到的那几十条,这样的设计几乎秒杀所有你们的设计,目前网上还没有看到这样设计的,对于高速滚动刷新表格非常有效。

tableView->verticalScrollBar()->setDisabled(true);

    QScrollBar* hScrollBar;

    vScrollbar = vBar;
    vScrollbar->setRange(0, ((unsigned int)BIT_CONST << 24 - row));//BIT_CONST=1,这里为什么要减去QTableView界面显示的行数row,因为滚动到底部时(滚不动时),看到的第一行是((unsigned int)BIT_CONST << 24 - row),底部显示的最后一行就是(BIT_CONST << 24)行,精妙

    hScrollBar = msgTableView->horizontalScrollBar();
    
    connect(hBar, &QScrollBar::valueChanged, hScrollBar, [=](int value) { 
        hScrollBar->setValue(value);
        });
    connect(hScrollBar, &QScrollBar::rangeChanged, hBar, [=](int min, int max) { 
        hBar->setRange(min, max); 
        });

    connect((QWidget*)vScrollbar, SIGNAL(valueChanged(int)), this, SLOT(verticalScrollMoved(int)));

//vBar hBar是我的代理滚动条,你在verticalScrollMoved处理展示数据

2022.12.12

今天调试垂直滚动条,显示总是少了一行,奇怪了,后来才知道,原来把QTableView的标题行也加了进去,所以这行应该是显示内容的,for的时候最后一行就少了,搞了好久下班前才解决,这里给大家提个醒,希望你们别犯同样的错误

void SpeedMsgTable::resizeEvent(QResizeEvent* ev)
{
    QSize qsize = tableView->size();//要用tableView就获取到了行高,不包括标题头,如果用this->那SpeedMsgTable是包含了标题头的,所以遍历的时候倒数第二个时就结束了,导致最后一行没有setData,所以就少了一行,蛋疼,搞了半天,低级错误,查了半天才找到是this->
    int height = qsize.height();
    row = height / rowHeight;
    adjustRows(row );//这个row就是用来设置setRange使用的,上面:vScrollbar->setRange(0, ((unsigned int)BIT_CONST << 24 - row));//这样显示出来不多不少
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值