我是QGraphicsView的子类,我想做的是:如果在鼠标移动时按下MidButton,那么我们就好像我们使用常规的QGraphicsView行动但是左边按下按钮,滑动图像。
我尝试过编码,但它似乎没有用,我也不知道为什么。
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);
}
}
任何帮助都将不胜感激。
编辑:删除了安东尼指出的明显错误。
答案 0 :(得分:2)
有一些问题。首先,测试条件应使用testFlags
而不是==
。其次,您使用Qt::MidButton
创建了活动,它应该是Qt::LeftButton
。最后,您还需要对mousePressEvent
进行类似的测试(以便QGraphicsView可以知道启动手动拖动)。
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);
}
}
答案 1 :(得分:0)
您的目标是将“手动拖动”模式的触发按钮从左按钮更改为中间按钮。
虽然事件更改方法有效,但它存在一些问题:当QGraphicsView
处于“手动拖动”模式时,它仍会传播左击,之后不会拖动到场景/项目。这意味着如果您在没有拖动的情况下进行中间点击和释放,它会认为您左键单击并在不拖动的情况下释放。您将有效地触发左键点击场景。
您可以改为覆盖中间点击的行为以直接滚动场景。此代码取自QGraphicsView::mouseMoveEvent()
:
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);
}