Qt:用鼠标将QGraphicsItem(boundingRect())调整为QGraphicsScene

时间:2014-03-21 10:21:46

标签: c++ qt resize mouseevent qgraphicsitem

我想使用鼠标调整boundingRect() QGraphicsItem的大小。

为了构建这个,我找到了这个topic。 所以我设法让我的boundingRect()的权利,彻头彻尾和底部都按照这个主题的想法运作。

但由于我的项目位置是在boundingRect()的左上角定义的,因此修改项目的大小会移动与此位置相关联的边缘会更复杂。

我尝试了左上角,但右下角也在移动。我想将右下角固定为仅改变大小而不是整个位置。

以下是我的代码的一部分:

void Myclass::mouseMoveEvent(QGraphicsSceneMouseEvent *event) 
{
    if(_resizemode) //if bottom selected
    {
        prepareGeometryChange();
        _h = event->pos().y();
    }

    if(_resizemode2) //if bottom right selected
    {
        prepareGeometryChange();
        _h = event->pos().y();
        _w = event->pos().x();

    }

    if(_resizemode3) //if right selected
    {
        prepareGeometryChange();
        _w = event->pos().x();
    }

    if(_resizemode4) //if top left selected HERE IS MY ISSUE
    {
        prepareGeometryChange();
        setPos(pos().x()+ event->pos().x(), pos().y() + event->pos().y());
        _h = _h - event->pos().y();
        _w = _w - event->pos().x();

    }

    if(!_resizemode&&!_resizemode2&&!_resizemode3&&!_resizemode4)
    {
    update();
    QGraphicsItem::mouseMoveEvent(event);
    }
}

_h_w或此处实施的高度和宽度:

QRectF Aabb::boundingRect() const
{
    return QRectF( 0, 0, _w, _h);
}

有人知道如何调整QGraphicsItem选择boundingRect()每个角落的鼠标大小吗?

2 个答案:

答案 0 :(得分:1)

  

我的项目的位置是在boundingRect()

的左上角定义的

在我看来,最简单的方法是更改​​此位置,以便位置由项目的中心定义。为此,将原始边界矩形定义为左上角(-w / 2,-h / 2)和右下角(w / 2,h / 2),或者如果要在boundingRect函数中返回QRectF( - 对于(x,y,w,h),w / 2,-h / 2,w,h)。

然后,在角落创建子'工具'项目,这些项目定义了您可以单击的区域并拖动原始项目的角落。如果选择了该项,您可能希望这些只是出现。

在子项的moveEvent中,更新主项的边界矩形,使其随子项一起移动。释放鼠标时,重新计算主项的boundingRect,使其中心仍为(0,0)。

如果你映射boundingRect的左上角和右下角并将它们转换为场景坐标,然后使用宽度和高度,重新设置项目的本地坐标以便它维护( - w / 2,-h / 2,w,h);

答案 1 :(得分:1)

我解决了我的问题。以下是我到目前为止mousePressEvent(定义原始boundingRect函数,如QRectF(-w/2, -h/2, w, h))所做的事情:

void Myclass::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    if(isSelected())
    {

    qDebug()<<"isseldeted";
    qreal adjust = 8;
    if((event->pos().x() > boundingRect().left() + adjust) && (event->pos().x() < boundingRect().right() - adjust) && (event->pos().y() < boundingRect().bottom() + adjust) && (event->pos().y() > boundingRect().bottom() - adjust) )
    {
        _adj = event->pos().y();
        _resizemode = true;
        qDebug()<<"bottom";
    }
    if((event->pos().x() > boundingRect().right() - adjust) && (event->pos().x() < boundingRect().right() + adjust) && (event->pos().y() < boundingRect().bottom() + adjust) && (event->pos().y() > boundingRect().bottom() - adjust))
    {
        _adj = event->pos().y();
        _adj2 = event->pos().x();
        _resizemode2 = true;
        qDebug()<<"bottom right";

    }

    if((event->pos().x() > boundingRect().right() - adjust) && (event->pos().x() < boundingRect().right() + adjust) && (event->pos().y() < boundingRect().bottom() - adjust) && (event->pos().y() > boundingRect().top() + adjust))
    {
        _adj2 = event->pos().x();
        _resizemode3 = true;
        qDebug()<<"right";

    }

    if((event->pos().x() > boundingRect().left() - adjust) && (event->pos().x() < boundingRect().left() + adjust) && (event->pos().y() > boundingRect().top() - adjust) && (event->pos().y() < boundingRect().top() + adjust))
    {
        _adj = event->pos().y();
        _adj2 = event->pos().x();
        _resizemode4 = true;
        qDebug()<<"top left";

    }

    if((event->pos().x() > boundingRect().left() - adjust) && (event->pos().x() < boundingRect().left() + adjust) && (event->pos().y() < boundingRect().bottom() - adjust) && (event->pos().y() > boundingRect().top() + adjust))
    {
        _adj2 = event->pos().x();
        _resizemode5 = true;
        qDebug()<<"left";

    }

    if((event->pos().x() > boundingRect().left() - adjust) && (event->pos().x() < boundingRect().left() + adjust) && (event->pos().y() < boundingRect().bottom() + adjust) && (event->pos().y() > boundingRect().bottom() - adjust))
    {
        _adj = event->pos().y();
        _adj2 = event->pos().x();
        _resizemode6 = true;
        qDebug()<<"bottom left";

    }

    if((event->pos().x() > boundingRect().left() + adjust) && (event->pos().x() < boundingRect().right() - adjust) && (event->pos().y() < boundingRect().top() + adjust) && (event->pos().y() > boundingRect().top() - adjust))
    {
        _adj = event->pos().y();
        _resizemode7 = true;
        qDebug()<<"top";

    }

    if((event->pos().x() < boundingRect().right() + adjust) && (event->pos().x() > boundingRect().right() - adjust) && (event->pos().y() < boundingRect().top() + adjust) && (event->pos().y() > boundingRect().top() - adjust))
    {
        _adj = event->pos().y();
        _adj2 = event->pos().x();
        _resizemode8 = true;
        qDebug()<<"top right";

    }
    }
update();
QGraphicsItem::mousePressEvent(event);
}

mouseReleaseEvent

void Myclass::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
if(_resizemode)
{
    prepareGeometryChange();
    _h += event->pos().y() - _adj; //good
    setPos(pos().x(), pos().y() + (event->pos().y() - _adj)/2 );//good

    _resizemode = false;
}

if(_resizemode2)
{
    _h += event->pos().y() - _adj; //good
    _w += event->pos().x() - _adj2;
    setPos(pos().x() + (event->pos().x() - _adj2)/2, pos().y() + (event->pos().y() - _adj)/2 );//good

    _resizemode2 = false;
}

if(_resizemode3)
{
    _w += event->pos().x() - _adj2;
    setPos(pos().x() + (event->pos().x() - _adj2)/2, pos().y());//good

    _resizemode3 = false;
}

if(_resizemode4)
{
    _h -= event->pos().y() - _adj; //good
    _w -= event->pos().x() - _adj2;
    setPos(pos().x() + (event->pos().x() - _adj2)/2, pos().y() + (event->pos().y() - _adj)/2 );//good

    _resizemode4 = false;
}

if(_resizemode5)
{
    _w -= event->pos().x() - _adj2;
    setPos(pos().x() + (event->pos().x() - _adj2)/2, pos().y());//good

    _resizemode5 = false;
}

if(_resizemode6)
{
    _h += event->pos().y() - _adj;
    _w -= event->pos().x() - _adj2;
    setPos(pos().x() + (event->pos().x() - _adj2)/2, pos().y() + (event->pos().y() - _adj)/2);//good

    _resizemode6= false;
}

if(_resizemode7)
{
    _h -= event->pos().y() - _adj;
    setPos(pos().x(), pos().y() + (event->pos().y() - _adj)/2);//good

    _resizemode7= false;
}

if(_resizemode8)
{
    _h -= event->pos().y() - _adj;
    _w += event->pos().x() - _adj2;
    setPos(pos().x() + (event->pos().x() - _adj2)/2, pos().y() + (event->pos().y() - _adj)/2);//good

    _resizemode8= false;
}

update();
QGraphicsItem::mouseReleaseEvent(event);
}

mouseMoveEvent也需要实施:

void Aabb::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{   if(!_resizemode&&!_resizemode2&&!_resizemode3&&!_resizemode4&&!_resizemode5&&!_resizemode6&&!_resizemode7&&!_resizemode8)
    {
    update();
    QGraphicsItem::mouseMoveEvent(event);
    }
}

问题在于我们没有看到移动中的大小调整:当我们释放鼠标时,我们会看到调整大小的项目。

有时项目没有完美重新定位,我不知道为什么。

所以这是有效的,但我相信它可以改进。