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