qt - 仅在形状内按下时移动 QGraphicsItem 否则,拖动场景

  显示原文与译文双语对照的内容
0 0

我有一个 QGraphicsView,它有一个更大的QGraphicsScene 可以拖动。 在 QGraphicsScene 中,我有一个显示 QGraphicsPixmapItem的子类 QGraphicsItem ( TestItem ),它可以有随机形状。 ( 因为将来要实现额外的功能,所以我不直接使用 QGraphicsPixmapItem )

我希望这里项可以移动,但只有当用户按下该项的形状时。 如果在图形外,但仍在 boundingRectangle 内部,我希望它后面的场景被拖动。 这是因为 boundingRectangle 可以比形状大,用户看不到它,因这里在 Pixmap 附近拖动场景很奇怪。

这是我的子类子类:


TestItem::TestItem(QPointF position, QPixmap testImage, double width, 
 double length, QGraphicsItem * parent):
 QGraphicsItem(parent),
 m_boundingRect(QRectF(0,0,5, 5)),
 m_dragValid(false),
 m_path(QPainterPath()),
 mp_image(new QGraphicsPixmapItem(this))
{
 setBoundingRect(QRectF(0,0,width,length));
 setPos(position - boundingRect().center());
 setFlag(QGraphicsItem::ItemIsMovable);
 mp_image->setPixmap(testImage.scaled(width, length));
 m_path = mp_image->shape();
}

QPainterPath TestItem::shape()
{
 return m_path;
} 

QRectF TestItem::boundingRect() const
{
 return m_boundingRect;
}

void TestItem::setBoundingRect(QRectF newRect)
{
 prepareGeometryChange();
 m_boundingRect = newRect;
}

我试图重写这样的鼠标事件,但它所带来的全部功能在外形外都没有,但在边界 rectangle 中。


void TestItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
 if(shape().contains(event->pos()))
 { 
 QGraphicsItem::mousePressEvent(event);
 m_dragValid = true;
 }
}

void TestItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
 if(m_dragValid)
 QGraphicsItem::mouseMoveEvent(event);
} 

void TestItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
 if(m_dragValid)
 QGraphicsItem::mouseReleaseEvent(event);

 m_dragValid = false;
}

当然,我不知道如何实现拖动场景,因为它是场景本身向图形项发送鼠标事件。

( 我的QGraphicsView 设置为 DragModeQGraphicsView::ScrollHandDrag )

有谁知道?

时间: 原作者:

0 0

我知道了。我只需要在鼠标事件中添加一个 event->ignore();


void TestItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
 if(shape().contains(event->pos()))
 { 
 QGraphicsItem::mousePressEvent(event);
 m_dragValid = true;
 }
 else
 event->ignore();
}

void TestItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
 if(m_dragValid)
 QGraphicsItem::mouseMoveEvent(event);
 else
 event->ignore();
} 

void TestItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
 if(m_dragValid)
 QGraphicsItem::mouseReleaseEvent(event);
 else
 event->ignore();

 m_dragValid = false;
}

0 0

你只需要启用 QGraphicsItem::ItemClipsToShape 标志:

将项目剪辑复制到它的自身形状。 项不能在它的形状外绘制或者接收鼠标,平板电脑,拖放或者悬停事件。 默认情况下禁用它。

原作者:
...