之前也参考了其他博客的优化技巧,在此总结一下,其实大多数时候我使用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));//这样显示出来不多不少
}