我正在做一个项目,我应该在QGraphicsScene上实现mousePressEvent和setDragMode。我可以单独实现,但我应该同时实现这两个。我将两者都包含在代码中但只有mousePressEvent工作且无法拖动场景。你能不能请任何人告诉我如何实现它们。请找到附加的代码。三江源。
MyGraphicsView.cpp
MyGraphicsView::MyGraphicsView(QWidget* parent) : QGraphicsView(parent) {
Scene = new QGraphicsScene(this);
setScene(Scene);
setDragMode(ScrollHandDrag);
}
void MyGraphicsView::mousePressEvent(QMouseEvent *eve)
{
if (eve->button() == Qt::LeftButton) {
// handle Left mouse button here
QPointF pt = mapToScene(eve->pos());
}
}
MyGraphicsView.h
class MyGraphicsView : public QGraphicsView
{
Q_OBJECT
protected:
virtual void mousePressEvent(QMouseEvent *eve);
}
答案 0 :(得分:0)
来自QGraphicsView关于DragMode属性的Qt文档:
(...)默认值NoDrag不执行任何操作。
此行为仅影响任何项目未处理的鼠标点击。您可以通过创建QGraphicsView的子类并重新实现mouseMoveEvent()来定义自定义行为。
这可能就是为什么在实现 mousePressEvent 时无法使DragMode开始工作的原因:事件被处理,因此Qt框架认为"作业是完成",无需触发拖动。
该文档建议重新实现 mouseMoveEvent 。它仍然提供 QMouseEvent ,因此您可以获取坐标以及当前按下鼠标按钮的信息。从那以后你只需要为 Idle实现一个状态机;的startDrag;拖动; FinishDrag
根据移动过程中按下的按钮,并在您需要的任何状态下实现所需的功能。