我需要子类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}}
感谢。