QTableview单击可以选择行,但是取消拖拽框选,用不重写的方法实现
时间: 2024-03-05 18:52:31 浏览: 91
你可以通过设置 `QTableView` 的属性来实现单击选择行,取消拖拽框选的功能,而不需要重写鼠标事件。具体实现方法如下:
首先,将 `QTableView` 的选择模式设置为行选择模式,这样单击就可以选择一整行:
```
tableView->setSelectionMode(QAbstractItemView::SingleSelection);
tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
```
然后在 `QTableView` 的 `mousePressEvent` 事件中,判断是否处于拖拽状态,如果是,则不处理事件;否则调用父类的事件处理函数,这样就可以取消拖拽框选。代码示例如下:
```
void MyTableView::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
if (QApplication::keyboardModifiers() & Qt::ControlModifier) {
// 如果按下了 Ctrl 键,则可以进行多选
QTableView::mousePressEvent(event);
} else {
// 否则只能选择一行,并取消拖拽框选
QPoint pos = event->pos();
QModelIndex index = indexAt(pos);
if (index.isValid()) {
selectRow(index.row());
} else {
clearSelection();
}
if (m_isDragging) {
return;
}
QTableView::mousePressEvent(event);
}
} else {
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 = false; // 结束拖拽状态
}
QTableView::mouseReleaseEvent(event); // 调用父类的事件处理函数
}
```
在 `mousePressEvent` 中判断是否按下了 Ctrl 键,如果是则可以进行多选;否则只能选择一行,并取消拖拽框选。在取消拖拽框选之前,需要判断是否处于拖拽状态,如果是,则不处理事件。
这样就可以实现单击选择行,取消拖拽框选的功能了,而不需要重写鼠标事件。
阅读全文