仅在按压形状内部时移动QGraphicsItem。否则,拖动场景

时间:2015-01-20 15:44:09

标签: qt qgraphicsview qgraphicsitem qgraphicsscene custom-widgets

我有一个QGraphicsView,可以拖动更大的QGraphicsScene。 在QGraphicsScene我有一个子类QGraphicsItemTestItem),它显示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

有人有想法吗?

2 个答案:

答案 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标志:

  

项目剪辑为自己的形状。该项目无法绘制或接收鼠标,平板电脑,拖放或悬停其形状之外的事件。默认情况下禁用它。