Мне нужен элемент управления графическим интерфейсом таблицы, который может быстро добавлять и отображать около 100 000 элементов.По этой причине необходим «виртуальный» табличный элемент управления, который загружает и показывает только видимые элементы.Я пробовал 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 () вызывается при добавлении новых элементов из видимой области.И это сильно замедляет работу.Это мой тестовый сценарий, чтобы быть более конкретным:
- Представление создается только с 5 элементами, которые могут быть видны одновременно.
- Я добавляю 20 элементов с помощью MyModel :: addItems.
- MyModel :: data вызывается для всех видимых элементов.
- MyModel :: data продолжает вызываться для видимых элементов (1 ... 5), когда элементы 6, 7, 9 ..Добавлено 20.
Я думал, что это может быть вызвано вертикальной полосой прокрутки, которая перерисовывается при добавлении новых элементов и, кажется, перерисовывает все QListView.Но после сокрытия вертикальной полосы прокрутки проблема осталась.Пожалуйста, предложите.