【发布时间】:2009-09-02 18:51:41
【问题描述】:
我有一个QTableView 使用QSqlTableModel。
在底层数据库(postgresql)表中有一个时间戳列。
如何在选择模型中选择基础时间戳列为 NULL 的所有行?
指向正确方向的指针会有所帮助。
更新:
我遇到的主要问题是性能。我尝试过的每种方法都会导致两个性能问题。
首先是对 selectionModel()->select(selection) 的调用需要 30 秒来处理大约 5,000 条选定记录。它似乎正在为每一行发出选择更改信号。即使信号处理程序被禁用,它仍然需要 10 秒。
第二个性能问题是,即使在使用所选行更新视图之后,尝试滚动视图也非常缓慢且滞后。我的猜测是选择模型由 5,000 个单独的选择组成,而不仅仅是最小数量的选择范围。
在我正在尝试选择的数据中是连续的;因此它应该能够表示为单个选择范围。如果我只是简单地调用tableView->selectAll(),那么这非常快。
我想知道是否有一种规范、有效的方法来选择一堆匹配的行。或者我的代码中可能存在导致性能回归的缺陷。有没有办法按照count0 的建议使用 QSortFilterProxyModel 来完成此任务?我希望视图显示所有行,但选择匹配的行。
这是我尝试的最后一种方法的代码 sn-p:
void MainWindow::selectNullTimestamp()
{
QModelIndex start = model->index(0, TIMESTAMP_COLUMN);
QModelIndexList indexes = model
->match(start, Qt::DisplayRole,
QVariant(QString("")),
-1,
Qt::MatchFixedString);
QItemSelectionModel* selection_model = ui->tableView->selectionModel();
QItemSelection selection;
foreach(QModelIndex index, indexes) {
QModelIndex left =
model->index(index.row(), 0);
QModelIndex right =
model->index(index.row(),
NUM_COLUMNS - 1);
QItemSelection sel(left, right);
selection.merge(sel, QItemSelectionModel::Select);
}
selection_model->select(selection, QItemSelectionModel::Select);
}
【问题讨论】:
标签: c++ qt qt4 model-view-controller