如何有效地选择符合特定条件的QTableView的行子集?

Kar*_*and 5 c++ model-view-controller qt qt4

我有一个QTableView使用QSqlTableModel.

在底层数据库(postgresql)表中有一个时间戳列.

如何选择基础时间戳列为NULL的选择模型中的所有行?

指向正确方向的指针会有所帮助.

更新:

我遇到的主要问题是表现.我尝试过的每种方法都会导致两个性能问题.

首先是对约5,000个选定记录的SELECTModel() - > select(选择)调用需要30秒.它似乎是为每一行发出选择改变信号.即使信号处理程序被禁用,它仍然需要10秒.

第二个性能问题是即使在使用所选行更新视图后,尝试滚动视图也非常缓慢且滞后.我的猜测是选择模型由5,000个单独的选择组成,而不仅仅是最小数量的选择范围.

在我正在试验的数据中,选择是连续的; 所以它应该能够表示为单个选择范围.如果我只是调用tableView-> selectAll(),那么这非常快.

我想知道的是,是否有一种规范,有效的方法来选择一堆匹配的行.或许我的代码中存在一个导致性能下降的缺陷.有没有办法使用count0建议的QSortFilterProxyModel 来实现这个目的?我希望视图显示所有行,但选择匹配的行.

以下是我尝试的最后一个方法的代码段:

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);

}
Run Code Online (Sandbox Code Playgroud)

swo*_*ngu 0

为了响应您的代码更新,如果您使用QAbstractItemView::SelectRows. 只需使用您从 收到的选择QAbstractItemModel::match()

至于速度,请检查发布构建上的表的效率 - 我知道调试/发布构建差异对于像您这样的情况来说很大。如果您使用 Qt 4.5,您也会注意到速度有所提高,因为他们确实致力于改进该版本中的表格等元素。

  • QAbstractItemModel 支持一个名为 match 的函数,它将为您进行搜索,并返回 QModelIndex 条目的列表 (2认同)