qtableview通过滑动选择的行,不会触发clicked(QModelIndex),如何解决
时间: 2024-10-22 11:04:45 浏览: 26
Qtablewidget和Qtableview实现手指滑动
5星 · 资源好评率100%
QTableView默认的交互设计中,当你通过拖动鼠标选择一行而不是单击时,是不会发送Clicked信号的,因为它认为这是一种视觉选择而非实际点击操作。如果你需要在行被拖动选择时也能得到通知,可以采取以下几种策略:
1. **设置双击模式**(Set Double Click Mode): 将`setEditTriggers(QTableWidget::NoEditTriggers)`设为`QTableWidget::DoubleClicked`或`QTableWidget::AllCellsChanged`,这样即使是拖动选择也会被视为双击。
```cpp
yourTableView->setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::AllCellsChanged);
```
2. **自定义槽函数**(Custom Slot): 监听`QTableView`的`currentCellChanged(const QModelIndex &oldRow, const QModelIndex &newRow)`信号,这个信号会在当前选中的单元格发生改变时发出。
```cpp
connect(yourTableView, &QTableView::currentCellChanged, this, [yourTableView](const QModelIndex &index) {
if (!index.isValid()) return;
// 处理cell changed 的逻辑
});
```
3. **使用信号代理** (Signal Proxy): 如果你不想修改`QTableView`的行为,你可以创建一个信号代理,并在代理里处理拖动选择的情况。
```cpp
QObject::connect(yourTableView, &QTableView::currentChanged, yourProxy, &YourProxyClass::cellDeselected);
QObject::connect(yourTableView, &QTableView::doubleClicked, yourProxy, &YourProxyClass::cellSelected);
```
在这个例子中,你需要定义`YourProxyClass`并连接相应的槽函数来响应`cellSelected`和`cellDeselected`信号。
阅读全文