QT 设置设备列表同步选择

博客分享了Qt项目开发中的问题及解决思路。如在syncSelection1和2中,用clearSelection后未更新另一TableView选择状态致选项目丢失;查找项目用index而非_devicesProxyModel->index()会失效;Deselect方法不统一,应统一用select;还缺少更新另一TableView选中项列表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 在syncSelection1和syncSelection2中,使用clearSelection清除之前选择,但是不接着更新另一个TableView的选择状态,导致丢失已选择项。

  2. 查找项目时使用的是index而不是_devicesProxyModel->index(),直接使用QModelIndex查找会失效。

  3. Deselect时使用的方法不同,一个使用setCurrentIndex一个使用select,应统一使用select方法。

  4. 缺少更新另一个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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值