我有一个QGraphicsView的子类,应该接受两种鼠标事件:拖放滚动和简单点击项目选择/突出显示。 所以我用
setDragMode(QGraphicsView::ScrollHandDrag);
启用使用" Hand"滚动视图。我有这样的功能:
void GraphView::mouseReleaseEvent(QMouseEvent* e)
{
if (e->button() == Qt::LeftButton)
emit leftClicked(mapToScene(e->pos()));
else
emit rightClicked(mapToScene(e->pos()));
QGraphicsView::mouseReleaseEvent(e);
}
只要用户点击场景就会创建信号。
然而,问题是:当我停止拖动并释放鼠标按钮时,会调用mouseReleaseEvent
函数,如果光标恰好位于场景的某个元素上,它将突出显示。
如何更改mouseReleaseEvent
功能,以便仅在以前没有拖动鼠标时才创建信号?
答案 0 :(得分:1)
如果将mousePress和mouseMove与mouseRelease结合使用,则可以确定用户刚刚执行的鼠标操作。
如果你有mousePress然后是mouseRelease,那么它必须是一个简单的点击。 如果你有mousePress,mouseMove,然后是mouseRelease,那么它必须是一个拖动。
Qt文档包含在涂鸦程序中解释鼠标事件组合的示例。 http://doc.qt.io/qt-4.8/qt-widgets-scribble-example.html
您可以将原则扩展为以下内容:
private bool MyWidget::dragging = false;
private bool MyWidget::pressed = false;
void MyWidget::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
pressed=true;
}
QGraphicsView::mousePressEvent(event)
}
void MyWidget::mouseMoveEvent(QMouseEvent *event)
{
if ((event->buttons() & Qt::LeftButton) && pressed)
{
dragging=true;
}
QGraphicsView::mouseMoveEvent(event)
}
void MyWidget::mouseReleaseEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton && pressed) {
pressed = false;
if (dragging)
{
dragging = false;
}
else
{
// plain mouse click
// do something here
}
}
QGraphicsView::mouseReleaseEvent(event)
}
请注意,这并不能解决仅在窗口小部件内部执行用户鼠标操作的边缘情况。我还必须承认我对Qt相对较新,并且还没有使用过ScrollHandDrag,但这就是人们如何识别鼠标事件的特定组合。