и долго миллион запросов выполняется?
setUniformItemSizes ( bool enable ) поможет.
Терпения не хватило! Думаю очень долго. Снимал задачу на нескольких сотнях.
Хм. После выполнения setUniformItemSizes(true); поведение изменилось - теперь QListView выполняет только один запрос к модели, data(const QModelIndex &index, Qt::DisplayRole), и все. Список в окне пуст, программа работает, хотя подвисает.
Похоже для анализа прийдется сделать новое пустое приложение и там гонять списки.
Собственно вот практически весь исходник пробного приложения:
C++ (Qt)
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
Listt = new QListView(this);
connect(ui->pushButton,SIGNAL(pressed()),this,SLOT(PushAction()));
}
MainWindow::~MainWindow()
{
delete Listt;
delete ui;
}
void MainWindow::PushAction(){
model = new Mmodel();
model->L1=ui->label;model->L2=ui->label_2;
Listt->resize(200,50);
Listt->setLayoutMode(QListView::Batched);
Listt->setModel(model);
}
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%
#include "mmodel.h"
Mmodel::Mmodel(QObject *parent) :
QAbstractListModel(parent)
{
}
/* ------------------------------------------------ */
int Mmodel::rowCount(const QModelIndex &parent) const
{
static int Ccounter=0;
Ccounter++;if(L1!=NULL)L1->setText(tr("Count rows gives=[%1]").arg(Ccounter));
return 1000000;
}
// ====================
QVariant Mmodel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
static int Ccounter=0;
if (role == Qt::DisplayRole){
Ccounter++;if(L2!=NULL)L2->setText(tr("Count data gives=[%1]").arg(Ccounter));
return tr("N=%1").arg(index.row());
}
else
if (role == Qt::UserRole){
return "---";
}
else
return QVariant();
}
QListView по-прежнему грузит через "data()" с Qt::DisplayRole столько строк, сколько возвращает функция "rowCount()". Может надо обработать ещё какую-то роль, кроме "DisplayRole"? Или утановить какой-то флаг у QListView???