C++ 子类化QGraphicsView,自定义鼠标事件
我是QGraphicsView的子类,我想做的是:如果鼠标移动时按下中键,那么我们就像使用常规的QGraphicsView操作过程一样,但按下左键会滑动图像 我试着编码,但似乎不起作用,我也不知道为什么C++ 子类化QGraphicsView,自定义鼠标事件,c++,qt,events,mouseevent,qgraphicsview,C++,Qt,Events,Mouseevent,Qgraphicsview,我是QGraphicsView的子类,我想做的是:如果鼠标移动时按下中键,那么我们就像使用常规的QGraphicsView操作过程一样,但按下左键会滑动图像 我试着编码,但似乎不起作用,我也不知道为什么 void MyQGraphicsView::mouseMoveEvent(QMouseEvent *event) { if (event->buttons() == Qt::MidButton) { QMouseEvent event2(QEvent::Mo
void MyQGraphicsView::mouseMoveEvent(QMouseEvent *event)
{
if (event->buttons() == Qt::MidButton)
{
QMouseEvent event2(QEvent::MouseMove, event->pos(), Qt::NoButton, Qt::LeftButton, Qt::NoModifier);
QGraphicsView::mouseMoveEvent(&event2);
}
}
任何帮助都将不胜感激
编辑:删除了Anthony指出的明显错误。存在一些问题。首先,测试条件应该使用
testFlags
,而不是=
。其次,您正在使用Qt::MidButton
创建事件,它应该是Qt::LeftButton
。最后,您还需要对mousePressEvent
执行类似的测试(以便QGraphicsView可以知道如何启动手动拖动)
您的目标似乎是将“手动拖动”模式的触发按钮从左键更改为中键 虽然事件更改方法可以工作,但它存在一些问题:当
QGraphicsView
处于“手动拖动”模式时,它仍然会传播左键单击,但随后不会拖动到场景/项目中。这意味着,如果您单击鼠标中键并在不拖动的情况下释放,它将认为您单击鼠标左键并在不拖动的情况下释放。您将有效地触发对场景的左键单击
您可以替代中键单击的行为来直接滚动场景。此代码取自QGraphicsView::mouseMoveEvent()
:
这就是我目前的代码:
if(event->buttons().testFlag(Qt::MidButton)){QMouseEvent-event2(QEvent::MouseMove,event->pos(),Qt::NoButton,Qt::LeftButton,Qt::NoModifier);QGraphicsView::mousemoveent(&event2);}
它不做我想做的事情,但测试似乎很好,因为它不做我在elif
中所做的事情,之后我确信它能工作。@Leo我只是用橡皮筋阻力测试了它。事实证明,使用滚动手拖动,您也需要重新实现mousePressEvent。请参阅编辑。谢谢,它现在可以工作了,唯一的问题是我必须按下一个新按钮才能停止此行为,仅释放中间按钮是不够的。@Leo那么您似乎必须对mouseReleaseEvent执行同样的操作。我把那个留给你谢谢,成功了!对于寻找mouseReleaseEvent的任何人来说,这里有一点不同:if(!event->buttons().testFlag(Qt::MidButton)){QMouseEvent event2(QEvent::MouseButtonRelease,event->pos(),Qt::LeftButton,Qt::MidButton | Qt::RightButton,Qt::NoModifier);QGraphicsView::mouseReleaseEvent(&event2)}
void mousePressEvent(QMouseEvent *event)
{
if (event->buttons().testFlag(Qt::MidButton))
{
QMouseEvent event2(QEvent::MouseButtonPress, event->pos(), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
// do default behavior as if you pressed the left button
QGraphicsView::mousePressEvent(&event2);
}
else
{
QGraphicsView::mousePressEvent(event);
}
}
void mouseMoveEvent(QMouseEvent *event)
{
if (event->buttons().testFlag(Qt::MidButton))
{
QMouseEvent event2(QEvent::MouseMove, event->pos(), Qt::NoButton, Qt::LeftButton, Qt::NoModifier);
// do default behavior as if you pressed the left button
QGraphicsView::mouseMoveEvent(&event2);
}
else
{
QGraphicsView::mouseMoveEvent(event);
}
}
void View::mousePressEvent(QMouseEvent *event)
{
_lastPos = event->pos();
QGraphicsView::mousePressEvent(event);
}
void View::mouseMoveEvent(QMouseEvent *event)
{
if (event->buttons().testFlag(Qt::MidButton))
{
QScrollBar *hBar = horizontalScrollBar();
QScrollBar *vBar = verticalScrollBar();
QPoint delta = event->pos() - _lastPos;
_lastPos = event->pos();
hBar->setValue(hBar->value() + (isRightToLeft() ? delta.x() : -delta.x()));
vBar->setValue(vBar->value() - delta.y());
}
QGraphicsView::mouseMoveEvent(event);
}