gpt4 book ai didi

c++ - QAbstractTableModel::data 方法调用次数过多

转载 作者:行者123 更新时间:2023-11-28 03:43:09 25 4
gpt4 key购买 nike

我需要一个能够快速添加和显示大约 100'000 个项目的表格 GUI 控件。出于这个原因,需要“虚拟”表控件,它只加载和显示可见的项目。我尝试了 QTableView 和 QAbstractTableModel:

class MyModel : public QAbstractTableModel
{
public:
MyModel(QObject * parent, IDataSource* dataSource)
: QAbstractTableModel(parent), m_dataSource(dataSource) {}

int rowCount(const QModelIndex& parent = QModelIndex()) const
{
return m_dataSource->rowCount();
}

int columnCount(const QModelIndex& parent = QModelIndex()) const
{
return 3;
}

QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const
{
if (role == Qt::DisplayRole)
{
return m_dataSource->cell(index.row(), index.column());
}
return QVariant();
}

bool addItem()
{
beginInsertRows(QModelIndex(), rowCount(), rowCount());
endInsertRows();
return true;
}

private:
IDataSource* m_dataSource;
};

...

MyModel* model = new MyModel(this, this);
m_ui.tableView->setModel(model);
m_ui.tableView->show();

问题是在可见区域之外添加新项目时会调用 MyModel::data()。这会大大降低性能。这是我的更具体的测试场景:

  1. 创建的 View 仅包含一次可见的 5 个元素。
  2. 我使用 MyModel::addItems 添加了 20 个项目。
  3. 为所有可见项目调用 MyModel::data。
  4. 在添加项目 6、7、9 ... 20 时,继续为可见项目 (1...5) 调用 MyModel::data。

我在想这可能是由于在添加新项目时重绘的垂直滚动条引起的,并且似乎使所有 QListView 重绘。但是隐藏垂直滚动条后问题仍然存在。请提出建议。

最佳答案

我没有找到如何防止 endInsertRows 调用导致额外调用 data() 方法。但是为多个项目调用一次 endInsertRows 可以解决性能问题。所以我打电话:

beginInsertRows(QModelIndex(), rowCount(), rowCount() + 1000);
endInsertRows();

而不是调用 1000 次:

beginInsertRows(QModelIndex(), rowCount(), rowCount());
endInsertRows();

关于c++ - QAbstractTableModel::data 方法调用次数过多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8483213/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com