Методът `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 все още се извиква, grabber 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().

РЕДАКТИРАНЕ: добавен 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);

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