1

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 がまだ呼び出された後、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);

何故ですか?

PSコードにいくつかの変更を加える前に、すべてがうまくいきました。残念ながら、古いコードを復元することはできず、何が損なわれたのか正確に理解できません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);
4

1 に答える 1

4

paint()が呼び出されない理由はboundingRect()、シンボルの関数が適切な値を返さないためです。

boundingRect()アイテムの関数を再定義してみてください。を返す必要がありQRectFます。

于 2012-11-15T22:09:01.343 に答える