我有一个显示项目的QTreeView和一个用于过滤的QSortFilterProxyModel。 QTreeView配置为SingleSelection和SelectRows。
如果使用过滤器删除了所选项目,则会选择下一个未过滤的项目。我想改变这种行为。我目前的想法是连接到rowsAboutToBeRemoved()并清除所选项目被移除的选择。
connect(_ui.treeView->model(), &QAbstractItemModel::rowsAboutToBeRemoved,
[this] (const QModelIndex & parent, int start, int end) {//check and clear selection});
但是,QT会在触发rowsAboutToBeRemoved()信号之前将选择更改为下一个项目。所以我无法测试删除的项目是否是所选项目。
如果项目被过滤,是否有更好的方法来清除选择?我更喜欢不涉及从QTreeView派生的解决方案。
答案 0 :(得分:1)
rowsAboutToBeRemoved不是一个信号,它是一个虚方法。
请参阅:http://doc.qt.io/qt-4.8/qtreeview.html
它不是QTreeView,而是具有信号的ItemModel:
http://doc.qt.io/qt-4.8/qitemselectionmodel.html#selectionChanged
QTreeWidget上有信号:
http://doc.qt.io/qt-5/qtreewidget.html#itemSelectionChanged
但是对于QTreeView,必须使用ItemModel和/或ItemDelegate。