我将 QSortFilterProxyModel 用于很多数据模型,并且效果很好。从 Qt5.3.0 更新到 Qt5.3.1 后,这部分发生了变化。
我的一个 GUI 面板使用一个 QTreeView,该 QTreeView 连接到一个 QSqlTableModel 的 QSortFilterProxyModel。SQL 模型分配给一个大约有 60000 行和 6 个公共列的数据库表。
使用 Qt5.3.0 数据加载很简单……加载数据需要几秒钟(使用任务管理器作为网络流量监视器),再用一秒钟在 QTreeView 中显示数据。
使用 Qt5.3.1 变得很痛苦......它仍然需要几秒钟来加载数据,但是在数据最终出现在视图中之前,它会阻塞整个 CPU 内核数分钟(使应用程序无响应)。
使用具有相似行数的自定义模型(源自抽象表模型)不会出现此问题。
我还尝试了一个普通的 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);
有人知道问题吗?有更好的解决方法吗?