1

我需要子类化QItemSelectionModel来处理我的特定模型的选择。主要是出于性能原因,因为类似这样的方法QItemSelectionModel::selectedRows()效率非常低:它每次都从头开始构建选择,对其进行排序并从我的代理模型返回结果。

对我来说最好的就是覆盖QItemSelectionModel::emitSelectionChanged(const QItemSelection &newSelection, const QItemSelection &oldSelection)

但这是一种非虚拟方法。重载也不起作用(视图调用基本实现)。

QItemSelectionModel::select(...)是调用的插槽emitSelectionChanged,但是,即使它是虚拟的,它也会使用带有 d 指针的私有数据,并且似乎很难覆盖。

有没有办法绕过这个烂摊子?

目前我正在使用连接到selectionChanged(...)信号的这个插槽:

void onSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
{
    selection.merge(selected, QItemSelectionModel::Select);
    selection.merge(deselected, QItemSelectionModel::Deselect);

    selectedRows.clear();

    if (!selection.isEmpty()) {
        const QModelIndexList &indexes = selection.indexes();
        int columns = proxy->columnCount();

        if (indexes.at(0).row() != indexes.at(1).row()) {
            // Shift selection
            int size = indexes.size() / columns;
            for (int i = 0; i < size; ++i) {
                selectedRows.append(proxy->mapToSource(indexes.at(i)));
            }

        } else {
            // Ctrl selection
            int size = indexes.size();
            for (int i = 0; i < size; i+=columns) {
                selectedRows.append(proxy->mapToSource(indexes.at(i)));
            }
        }
    }
}

如果需要,这是来源:http: //qt.gitorious.org/qt/qt/source/ab4035d522eede6e6fb9251b521ab9e030fa13e3:src/gui/itemviews/ qitemselectionmodel.cpp

谢谢。

4

0 回答 0