gpt4 book ai didi

c++ - `paint` 方法是 't called after ` QGraphicsView` 滚动

转载 作者:行者123 更新时间:2023-11-30 02:03:04 25 4
gpt4 key购买 nike

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

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

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

在我滚动 graphicsview 之前它工作正常,第一个项目在 View 中不是完整的。在这个 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);

这是为什么呢?

附言在我对代码进行一些更改之前,一切都运行良好。不幸的是,我无法恢复旧代码,也无法理解到底是什么破坏了 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);

最佳答案

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

尝试为您的项目重新定义 boundingRect() 函数。它必须返回一个 QRectF

关于c++ - `paint` 方法是 't called after ` QGraphicsView` 滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12501745/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com