我有一个QGraphicsView
,可以拖动更大的QGraphicsScene
。
在QGraphicsScene
我有一个子类QGraphicsItem
(TestItem
),它显示QGraphicsPixmapItem
,可以有随机形状。
(我不会直接使用QGraphicsPixmapItem
,因为将来会实施额外的功能)
我想要这个项目是可移动的,但只有当用户按下项目的形状时才这样。如果在形状之外,但仍在boundingRectangle
内,我希望拖动它后面的场景。这是因为boundingRectangle
可能比形状大得多而且用户没有看到它,所以试图拖动Pixmap
附近的场景并且它无法正常工作会很奇怪。 p>
这是我的子类:
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;
}
我试过覆盖像这样的鼠标事件,但它带给我的只是在形状之外但在边界矩形内部没有任何功能
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
设置为DragMode
QGraphicsView::ScrollHandDrag
)
有人有想法吗?
答案 0 :(得分:2)
我明白了。我只需要在我的鼠标事件中添加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;
}
答案 1 :(得分:0)
您只需要启用QGraphicsItem::ItemClipsToShape
标志:
项目剪辑为自己的形状。该项目无法绘制或接收鼠标,平板电脑,拖放或悬停其形状之外的事件。默认情况下禁用它。