QTableview单击可以选择行,但是取消拖拽框选
时间: 2023-07-06 07:30:00 浏览: 306
QTableWidget实现行选、列选
4星 · 用户满意度95%
你可以通过在 `QTableView` 中重写鼠标事件来实现这个需求:
首先,将 `QTableView` 的选择模式设置为行选择模式,这样单击就可以选择一整行:
```
tableView->setSelectionMode(QAbstractItemView::SingleSelection);
tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
```
然后重写 `mousePressEvent` 和 `mouseMoveEvent` 事件,当鼠标按下时记录鼠标位置,并在移动过程中判断是否超过了一定的拖拽距离,如果超过了,则认为是拖拽操作,否则认为是单击操作。代码示例如下:
```
void MyTableView::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
m_startPos = event->pos(); // 记录鼠标按下的位置
m_isDragging = false; // 初始化为单击操作
}
QTableView::mousePressEvent(event); // 调用父类的事件处理函数
}
void MyTableView::mouseMoveEvent(QMouseEvent *event)
{
if (event->buttons() & Qt::LeftButton) {
// 如果鼠标按下并移动,则判断是否超过了拖拽距离
QPoint delta = event->pos() - m_startPos;
if (delta.manhattanLength() > QApplication::startDragDistance()) {
m_isDragging = true; // 超过拖拽距离,认为是拖拽操作
}
}
QTableView::mouseMoveEvent(event); // 调用父类的事件处理函数
}
void MyTableView::mouseReleaseEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton && !m_isDragging) {
// 如果是单击操作,则选择当前行
QModelIndex index = indexAt(event->pos());
if (index.isValid()) {
selectRow(index.row());
}
}
QTableView::mouseReleaseEvent(event); // 调用父类的事件处理函数
}
```
在 `mousePressEvent` 中记录鼠标按下位置,初始化为单击操作;在 `mouseMoveEvent` 中判断鼠标移动距离,超过拖拽距离则认为是拖拽操作;在 `mouseReleaseEvent` 中如果是单击操作并且鼠标在一行内释放,则选择当前行。
这样就可以实现单击选择行,取消拖拽框选的功能了。
阅读全文