子类化 QGraphicsView,自定义鼠标事件
Subclassing QGraphicsView, custom mouse events
我正在对QGraphicsView进行子类化,我想做的是:如果在鼠标移动时按下中间按钮,那么我们就像使用常规的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);
}
}
任何帮助将不胜感激。
编辑:删除了安东尼指出的明显错误。
有几个问题。首先,测试条件应使用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);
}
}
您的目标似乎是将"手拖"模式的触发按钮从左侧按钮更改为中间按钮。
虽然事件更改方法有效,但它存在一些问题:当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);
}
相关文章:
- 跟踪滚动条上的鼠标事件
- Qt-如何在Qt3DWindow上获取鼠标事件
- Qt:如何防止为平板电脑事件生成鼠标事件
- 如何使用 c++ mfc 在屏幕上获取鼠标事件
- WM_PAINT和鼠标事件.MFC/WIN32 API.
- 通过鼠标事件传递数据
- 鼠标区域窃取QQuickItem的鼠标事件
- Windows Console API鼠标事件只是进入选择模式
- 无法跟踪鼠标事件 OpenCV
- Qt. 忽略小部件中的任何鼠标事件,而不是另一个小部件
- WXWIDGETS将鼠标事件连接到WXPAINTDC上的形状对象以删除
- Qt/Qml - 触发 QApplication/QQmlApplicationEngine 事件(键和鼠标事件)
- Juce 鼠标事件不起作用
- 是否可以捕获全局鼠标事件
- 单击QCHART图的轴时捕获鼠标事件
- OpenCV 鼠标事件始终在鼠标滚动时接收事件 10 和 *flag* 0
- 鼠标事件选取器打开场景图
- 将鼠标事件发送到虚拟现实OpenGL场景中的QtQuick窗口
- 处理鼠标事件SFML
- 是否可以在 wxFrame 中捕获鼠标事件