重写QGraphicsView::RubberBandDrag 实现右键拖动不选中graphicsItem
时间: 2024-01-07 13:02:39 浏览: 156
Qt QGraphicsView 控件实现标尺和刻度先效果
5星 · 资源好评率100%
好的,我会尝试回答您的问题。
首先,您需要重新实现QGraphicsView的鼠标事件函数。在QGraphicsView的mousePressEvent函数中,您需要判断一下鼠标是否为右键,并且在鼠标按下时记录下鼠标的位置。
在QGraphicsView的mouseMoveEvent函数中,您需要判断一下鼠标是否为右键,并且在鼠标移动时计算出鼠标移动的距离,根据这个距离来判断是否触发了右键拖动。
如果触发了右键拖动,那么您可以调用QGraphicsView的setDragMode函数来设置拖动模式为NoDrag,这样就可以防止选中graphicsItem了。
最后在QGraphicsView的mouseReleaseEvent函数中,您需要判断一下鼠标是否为右键,并且在鼠标释放时恢复拖动模式。
下面是一个示例代码,可能需要根据您的具体需求进行修改:
```c++
void MyGraphicsView::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::RightButton) {
m_lastPos = event->pos();
}
QGraphicsView::mousePressEvent(event);
}
void MyGraphicsView::mouseMoveEvent(QMouseEvent *event)
{
if (event->buttons() & Qt::RightButton) {
int dx = event->pos().x() - m_lastPos.x();
int dy = event->pos().y() - m_lastPos.y();
int dist = dx * dx + dy * dy;
if (dist > QApplication::startDragDistance()) {
setDragMode(QGraphicsView::NoDrag);
}
}
QGraphicsView::mouseMoveEvent(event);
}
void MyGraphicsView::mouseReleaseEvent(QMouseEvent *event)
{
if (event->button() == Qt::RightButton) {
setDragMode(QGraphicsView::RubberBandDrag);
}
QGraphicsView::mouseReleaseEvent(event);
}
```
希望这个回答能够帮助到您!
阅读全文