【问题标题】:QGraphicsView dragMoveEvent, mouseMoveEvent, mousePressEvent used in the same timeQGraphicsView的dragMoveEvent、mouseMoveEvent、mousePressEvent同时使用
【发布时间】:2013-12-12 08:42:54
【问题描述】:

在 QGraphicsView 中,

setDragMode(QGraphicsView::ScrollHandDrag);

这行代码做了我想做的事:拖动时滚动内容。但是,如果我根据自定义需求实现了mouseMoveEventmousePressEventsetDragMode(QGraphicsView::ScrollHandDrag) 的魔力就会消失。

这些内置函数似乎有一些依赖关系,大多数时候它们很方便,但是当你实现其中一个时,你会破坏这些依赖关系之间的链,从而使其中一些消失。

我不想从头开始实现所有这些功能。如何解决这个困境?

==================编辑 12/13================

好的,我正在尝试,但是...

void MyView::mouseMoveEvent( QMouseEvent* event )
{

    // Notice: event->button() always return Qt::NoButton for "mouse move events"
    // so event->button() == Qt::LeftButton won't work in this case
    if(event->buttons() & Qt::LeftButton)
    {
        this->dragMoveEvent(dynamic_cast<QDragMoveEvent*>(event));
    }
    else
    {
        ...
    }


}

这些代码失败,因为QMouseEvent* 不能转换为QDragMoveEvent*,知道吗?

【问题讨论】:

  • 您是否尝试过在您的mouseMoveEvent()mousePressEvent() 函数中调用QGraphicsView::mouseMoveEvent()QGraphicsView::mousePressEvent()
  • 感谢您的建议。但是,如何在 MyView::mouseMoveEvent() 中调用 QGraphicsView::dragMoveEvent()?
  • 你为什么要在MyView::mouseMoveEvent()里面调用QGraphicsView::dragMoveEvent
  • 鼠标移动时需要 1).没有按下左键:检测悬停事件,以便我可以获取鼠标位置的像素值,2)。按下左键:将其视为拖动事件以充当 setDragMode(QGraphicsView::ScrollHandDrag)
  • 如果您将拖动模式设置为QGraphicsView::ScrollHandDrag,则在拖动过程中不应激活悬停事件。只要你从自己的mouseMoveEvent函数调用QGraphicsView::mouseMoveEvent就可以了。

标签: qt drag mousemove qgraphicsview


【解决方案1】:

@thuga 是对的。在子类函数的末尾放置对原始函数的引用。像这样:

void MyGraphicsView::mouseMoveEvent(QMouseEvent * e)
{
    static QPoint oldPos;
        if(!m_not_dragging)
        {
                // some logic for drawing something based on the mouse move
            // Edit added this function call.
            doMyDrag(e->pos(), oldPos);
            oldPos = e->pos();
        }
        else
        {
                QGraphicsView::mouseMoveEvent(e);
        }
}
// EDIT added the two functions below
void MyGraphicsView::dragMoveEvent(QMouseEvent * e)
{
    static QPoint oldPos;
    doMyDrag(e->pos(), oldPos);
    oldPos = e->pos();

    QGraphicsView::dragMoveEvent(e);
}

void MyGraphicsView::doMyDrag(QPoint new, QPoint old)
{
    // common drawing logic for both official drag events 
    //and pseudo drag events.
}

您甚至可以在此函数调用中根据e-&gt;button() 确定m_not_dragging,但这是一个快速示例,您可以同时使用自定义方法和默认方法。

希望对您有所帮助。

【讨论】:

  • 感谢您的建议。但是,如何在 MyView::mouseMoveEvent() 中调用 QGraphicsView::dragMoveEvent()?
  • 如果没有真正开始拖动,您可能应该只在第三个函数中拥有这两个函数的核心功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-12
  • 1970-01-01
  • 1970-01-01
  • 2020-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多