В Qt 5.3.1 появилась проблема с QSqlTableModel и QSortFilterProxyModel
Я использую QSortFilterProxyModel для многих моделей данных, и он работал нормально. После обновления с Qt5.3.0 до Qt5.3.1 это изменилось частично.
Одна из моих панелей графического интерфейса использует QTreeView, прикрепленный к QSortFilterProxyModel, прикрепленной к QSqlTableModel. Модель SQL назначается таблице базы данных с около 60000 строками и 6 общими столбцами.
Использовать загрузку данных Qt5.3.0 было просто... потребовалось несколько секунд для загрузки данных (использовался диспетчер задач в качестве монитора сетевого трафика) и еще одна секунда для отображения данных в QTreeView.
Используя Qt5.3.1, который стал болезненным... ему все еще нужно несколько секунд для загрузки данных, но затем он блокирует все ядро ЦП на несколько минут (делая приложение не отвечающим на запросы), прежде чем данные наконец появятся в представлении.
Эта проблема не возникает при использовании пользовательских моделей (полученных из модели абстрактной таблицы) с аналогичным количеством строк.
Я также попробовал то же самое с простым QSqlTableModel и созданным по умолчанию QSortFilterProxyModel (что означает, что фильтрация вообще не производится)... загрузка все равно требует нескольких минут. Это код, который я использую:
sqlTableModel = new QSqlTableModel(nullptr, QSqlDatabase::database(connectionName));
proxyModel = new QSortFilterProxyModel();
proxyModel->setSourceModel(sqlTableModel);
tableView = new QTableView();
tableView->setSortingEnabled(true);
tableView->setModel(proxyModel);
sqlTableModel->database().open();
sqlTableModel->setTable("table_name");
sqlTableModel->select();
Я нашел два обходных пути. Однако они не достаточно сильны, чтобы делать то, что я сейчас делаю, используя модель прокси:
- Использование сортировки и фильтрации QSqlTableModel (на основе WHERE и ORDER BY).
- Отключение сортировки
setSortingEnabled(false);
Кто-то знает проблему? Есть ли лучший обходной путь?