-
在syncSelection1和syncSelection2中,使用clearSelection清除之前选择,但是不接着更新另一个TableView的选择状态,导致丢失已选择项。
-
查找项目时使用的是index而不是_devicesProxyModel->index(),直接使用QModelIndex查找会失效。
-
Deselect时使用的方法不同,一个使用setCurrentIndex一个使用select,应统一使用select方法。
-
缺少更新另一个TableView的选中项列表。
void NodeDevicesSelectorWidget::syncSelection1(const QItemSelection& selected, const QItemSelection& deselected)
{
if (_syncingSelection)
return;
_syncingSelection = true;
auto selectedIndexes = selected.indexes();
QModelIndexList deselectedIndexes = deselected.indexes();
QItemSelectionModel* selectionModel2 = _devicesView2->selectionModel();
QModelIndexList selectedIndexes2 = selectionModel2->selectedIndexes();
_devicesView2->selectionModel()->clearSelection();
for (const QModelIndex& index : selectedIndexes)
{
_devicesView2->selectRow(index.row());
// _devicesView2->selectionModel()->select(_devicesProxyModel2->index(index.column(), index.row()),
// QItemSelectionModel::Select | QItemSelectionModel::Rows);
}
for (const QModelIndex& index : deselectedIndexes)
{
// _devicesView->selectionModel()->setCurrentIndex(QModelIndex(index), QItemSelectionModel::Deselect);
_devicesView2->selectionModel()->select(_devicesProxyModel2->index(index.column(), index.row()),
QItemSelectionModel::Deselect | QItemSelectionModel::Rows);
}
for (const QModelIndex& index : selectedIndexes2)
{
_devicesView2->selectionModel()->select(index, QItemSelectionModel::Select | QItemSelectionModel::Rows);
}
_syncingSelection = false;
}
更新后代码:
void NodeDevicesSelectorWidget::syncSelection1(const QItemSelection& selected, const QItemSelection& deselected)
{
// 标记是否正在同步选择,如果正在同步则直接返回
if (_syncingSelection)
return;
// 设置为正在同步选择
_syncingSelection = true;
// 获取当前TableView选择的QModelIndex
auto selectedIndexes = selected.indexes();
// 获取当前TableView取消选择的QModelIndex
QModelIndexList deselectedIndexes = deselected.indexes();
// 获取另一个TableView的选择模型
QItemSelectionModel* selectionModel2 = _devicesView2->selectionModel();
// 获取另一个TableView原来选择的QModelIndex
QModelIndexList selectedIndexes2 = selectionModel2->selectedIndexes();
// 清除另一个TableView之前的选择
selectionModel2->clearSelection();
// 遍历当前选择的QModelIndex
for (const QModelIndex& index : selectedIndexes) {
// 通过proxy model转换成index,重设选择
selectionModel2->select(_devicesProxyModel2->index(index.row(), 0),
QItemSelectionModel::Select | QItemSelectionModel::Rows);
}
// 遍历原来已经选择的QModelIndex
for (const QModelIndex& index : selectedIndexes2) {
// 保持原有选择项选择状态
selectionModel2->select(_devicesProxyModel2->index(index.row(), 0),
QItemSelectionModel::Select | QItemSelectionModel::Rows);
}
// 遍历取消选择的QModelIndex
for (const QModelIndex& index : deselectedIndexes) {
// 取消对应项的选择
selectionModel2->select(_devicesProxyModel2->index(index.row(), 0),
QItemSelectionModel::Deselect | QItemSelectionModel::Rows);
}
// 选择同步完成,重置同步标记位
_syncingSelection = false;
}