Метод `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, Идея заключается в том, что при наведении курсора на элемент появляется граббер, чтобы вы могли перетащить его для изменения размера основного элемента.

Он работает нормально, пока я не прокручиваю graphicsview, так что первый элемент не является целым в представлении. И еще этот 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);

Это почему?

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

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

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);

1

Решение

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

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

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]