`QGraphicsView`滚动后不调用`paint`方法

时间:2012-09-19 19:42:40

标签: c++ qt qgraphicsview qgraphicsscene qpainter

我现场有一个QGraphicsItemhoverEnterEvent已为此项重新实现。这是hoverEnterEvent的代码:

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

A_CornerGrabber是一个继承自QGraphicsRectItem的类。这个想法是当您悬停项目时出现一个抓取器,这样您就可以拖动它来调整主要项目的大小。

它工作正常,直到我滚动图形视图,因此,第一个项目在视图中不完整。并且afetr这个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()

编辑:添加了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 个答案:

答案 0 :(得分:4)

未调用paint()的原因是符号的boundingRect()函数未返回正确的值。

尝试重新定义项目的boundingRect()功能。它必须返回QRectF