Можно ли обратиться к элементу ListView? Qt
Доброго времени суток.
На прошлый вопрос мне так и не ответили, придется уточнить в новом. Есть база данных клиентов, там хранится множество полей. И есть такой код:
//Синхронизация ListWidget с базой данных
void MainWindow::listWidgetUpdate()
{
ui->listWidget->clear();
QSqlQuery query_update("SELECT * FROM clients");
QSqlRecord rec = query_update.record();
while(query_update.next()){
companyName = query_update.value(rec.indexOf("companyName")).toString();
ui->listWidget->addItem(companyName);
QVariant id = query_update.value(rec.indexOf("id")).toString();
ui->listWidget->item(ui->listWidget->count()-1)->setData(Qt::UserRole, id);
}
}
Из базы данных я забираю названия и вставляю в ListWidget, каждому элементу присваивая так же взятый из БД id. (->setData). Суть в том, что при нажатии на элемент ListWidget, выводятся все поля этой компании, обращаясь к БД по айди, хранящемуся в Data.
Проблема в том, что это очень медленно. При тестировании на 5000+ компаний, всё подвисает, причем очень недурно. А ведь необходимо, чтобы данные еще и обновлялись что называется "в лайве" и у пользователей всегда была актуальная информация. То есть таймеры и т.д. тут не прокатят. Подскажите, можно ли получить аналогичную функциональность, пользуясь QSqlQueryModel и, допустим, ListView? Ибо я не нашел, как можно к элементам ListView обращаться и тем более запихивать в них дополнительные данные. Если же нет, то какие еще варианты более быстрого решения Вы можете предложить?
Ответы (1 шт):
QListView обменивается данными с моделью с помощью функций data и setData.
Вариант для вас: вывести свой класс из QAbstractItemModel, реализовать в нём data() и setData(). Затем создать экземпляр этого класса и установить функцией QListView::setModel();
И обратите внимание на функции beginResetModel(), endResetModel() (и им подобные) менять данные в модели можно только между ними, это фактически сигнал о том, что модель изменилась