QTableWidget加载大量数据不卡顿解决办法
最近在模仿网易云音乐的UI,积累自己的代码能力,在使用QTabbleWidget的时候发现加载大量数据会导致卡顿,这个不能忍。
原因
- 设置了自适应宽度
// item 水平表头自适应大小
tab->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
// item 垂直表头自适应大小
ui->tableWidget->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);
//试着设置为: QHeaderView::Fixed 看看是否还会卡顿
- 加载的数据太大
解决方案
- QTableView 配合 Model (推荐)
- 我们知道 QTableWidget 每次显示的数据有限(屏幕只有这么大),我们利用这一点来实现动态加载item,解决卡顿的问题
- 使用事件过滤器,或者 重写鼠标事件,
//需要重写的虚函数
virtual void wheelEvent(QWheelEvent* event)
//事件过滤器
virtual bool eventFilter(QObject* obj, QEvent* event)
举例说明
1.我们首先先加载一定量的数据,这样就不会卡了。
2.为了防止越界,每次循环我们都应该判断一下
3.用一个 curtableindex 来记录当前数据的位置,方便之后加载剩余的数据
void SongMenu::loadData()
{
int len = taglsit.length();
for (int i = 0; i != 20; ++i) {
if (i >= len)return;
ui->tab_SongTable->insertRow(i);
//添加窗口小部件
ui->tab_SongTable->setCellWidget(i, 0, base->