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