Как "выбрать" последний элемент QListView?

Существует программа учета клиентов. Из базы данных в модель QSqlQueryModel закидываю имя и id клиента, вывожу имена в ListView. При нажатии на отдельный элемент открывается форма полной информации о выбранном клиенте, полученная путем обращения к базе данных по id.

Суть в следующем, раньше этот функционал выполнял QListWidget, но от него я отказался из-за скорости с большим кол-вом данных. Весь функционал восстановил, кроме одного. Допустим, добавляю я в бд нового клиента, после чего обновляю модель:

void MainWindow::UpdateClients()
{
    searchModel->setQuery("SELECT id, companyName FROM clients");
    while (searchModel->canFetchMore()){
         searchModel->fetchMore();
    }
}

ListView обновляется, а новый пользователь добавился в конец. Как его сразу "активировать" - то есть произвести нажатие + скроллбар отмотать до самого конца? Есть сигнал

void MainWindow::on_listView_clicked(const QModelIndex &index)

С помощью него вывожу инфу о выбранном клиенте, но для сего действия нужно знать индекс последнего элемента. Как быть?


Ответы (1 шт):

Автор решения: Fat-Zer

В первом приближении, как-то так:

int rowCount = listView->model()->rowCount();
QModelIndex lastIndex = listView->model()->index(rowCount-1, 0);
listView->setCurrent(lastIndex);

Но см. описание QSqlQueryModel::rowCount() — для некоторых драйверов баз данных, вероятно, придётся сначала предварительно вручную закешировать все данные из базы.

Также, строго говоря, это будет просто последний элемент в таблице, который может и не быть только что вставленным.

→ Ссылка