我需要一個表格GUI控件,它能夠快速添加和顯示大約100'000個項目。 因此,需要「虛擬」表格控件,該控件僅加載和顯示僅可見項目。 我試圖QTableView中和QAbstractTableModel:QAbstractTableModel :: data方法被調用的次數太多
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 ::數據()增加新的項目了可視面積時被調用。這使得性能下降很慢。 這是我的測試場景更具體:
- 查看是創建只有5個元素,可以在一次可見。
- 我用MyModel :: addItems添加了20個項目。
- MyModel :: data是爲所有可見項目調用的。
- 添加項目6,7,9 ... 20時,繼續爲可見項目(1 ... 5)調用MyModel :: data。
我在想也許這可能是由於添加新項目時重繪的垂直滾動條引起的,並且似乎使所有QListView重繪。但隱藏垂直滾動條後,問題依然存在。 請建議。