在QGraphicsView中,
setDragMode(QGraphicsView::ScrollHandDrag);
这行代码完成了我想要的:拖动时滚动内容。但是,如果我为自定义需求实施了mouseMoveEvent
或mousePressEvent
,那么setDragMode(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*
,任何想法?
答案 0 :(得分:0)
@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.
}
您甚至可以在此函数调用中根据m_not_dragging
确定e->button()
,但这是您可以同时使用自定义方法和默认方法的一种快速示例。< / p>
希望有所帮助。