子类化QItemSelectionModel C ++ / Qt

时间:2013-09-02 21:44:25

标签: c++ qt

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

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

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

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

如果需要,请来源:[{3}}

感谢。

0 个答案:

没有答案