Метод `paint` не вызывается после прокрутки `QGraphicsView`

У меня есть QGraphicsItem на сцене. hoverEnterEvent повторно реализован для этого предмета. Это код от hoverEnterEvent:

grabber = new agnt::A_CornerGrabber(A_CornerGrabber::TOP_RIGHT,this,8,3);
assert(grabber);
grabber->installSceneEventFilter(this);
update(boundingRect());

A_CornerGrabber — это класс, унаследованный от QGraphicsRectItem. Идея заключается в том, что когда вы наводите курсор на элемент, появляется граббер, поэтому вы можете перетаскивать его, чтобы изменить размер основного элемента.

Он работает нормально, пока я не прокручиваю графику, чтобы этот первый элемент не был целым в представлении. И после того, как этот hoverEnterEvent все еще вызывается, ctor граббера все еще вызывается, но метод grabber->paint() больше не вызывается. Вот grabber->paint():

    painter->setPen(Qt::NoPen);
    QRectF pRect  = parent->boundingRect();
    painter->drawRect(rect());
    setPos(pRect.bottomRight().x()-size-adjust,pRect.bottomRight().y()-size-adjust);

Почему это?

P.S. Некоторое время назад все работало нормально, прежде чем я внес некоторые изменения в свой код. К сожалению, я не могу восстановить старый код и не могу понять, что именно испортило grabber->paint().

РЕДАКТИРОВАТЬ: добавлена ​​сценаEventFilter()

if(event->type()== 155)
{
    QGraphicsSceneMouseEvent* me = dynamic_cast<QGraphicsSceneMouseEvent*>(event);
    if(!me) return true;
    if(rect().adjusted(0,0,me->pos().x()-me->lastPos().x(),0).width()>xStep)
    {
        prepareGeometryChange();
        int relX = me->pos().x() - xOffset;
        int newRelX = me->lastPos().x() - xOffset;
        int steps = relX/xStep;
        int newSteps = newRelX/xStep;
        setWidth(getWidth()+xStep*(steps-newSteps));
        setInitialTime(QString::number(getTime().toInt()+(steps - newSteps) ) );// my func
    }
}
if(event->type()== 187)
{
    dynamic_cast<agnt::A_GntGV*>(scene()->views().at(0))->timeChanged(getT(),getId());
    //my func, has nothing to do with painting
}

if(event->type()==160||event->type()==162)
    return false;
return true;

РЕДАКТИРОВАТЬ 2: я думаю, что sceneEventFilter() даже не имеет значения. Проблема сохраняется, если я прокомментирую

//grabber->installSceneEventFilter(this);

person Alexander    schedule 19.09.2012    source источник
comment
Не могли бы вы показать код функции eventFilter, которую вы установили на граббер?   -  person alexisdm    schedule 20.09.2012


Ответы (1)


Причина, по которой paint() не вызывается, заключается в том, что функция boundingRect() вашего символа не возвращает правильное значение.

Попробуйте переопределить функцию boundingRect() для вашего элемента. Он должен вернуть QRectF.

person maxime-esa    schedule 15.11.2012