- jak QGraphicsItem wie, kiedy zmienia się rect?
Myślę, że znasz. Załóżmy, że masz grupę QGraphicsItemGroup, która zbiera kilka elementów podrzędnych i chcesz wyświetlać tylko jedno dziecko naraz. Obwiedni rect elementu grupy musi być taka sama jak okalającym rect aktualnie wybranego elementu:
QRectF MyItemGroup::boundingRect() const
{
QRectF rect;
if (currentItem_) {
rect = currentItem_->boundingRect();
}
return rect;
}
Załóżmy, że masz sposób na zmiany, które jedno z dzieci ma zostać pokazany:
void MyItemGroup::setCurrentItem(MyItem * item)
{
if (list_of_items_.contains(item)) {
prepareGeometryChange();
currentItem_ = item;
}
}
Jeśli skomentujesz metodę prepareGeometryChange, widok nie będzie ponownie pytał o prostokąt prostokątu MyItemGroup, a aktualizacja elementu (uruchomiona gdzie indziej) będzie zawierała zły rect.
- Skąd wiadomo, kiedy należy wywołać aktualizację()?
Zgodnie ze źródłami QGraphicsItem wewnątrz aktualizacji prepareGeometry
metoda jest wywoływana tylko w dwóch przypadkach:
- jeśli ktoś jest podłączony do sygnału
changed
jeśli scena ma widoki
więcej informacji here
- Czy kiedykolwiek powinieneś wywołać funkcję update() samodzielnie po wywołaniu prepareGeometryChange(), a następnie zmianie prostokąta ograniczającego?
Myślę, że odpowiedź brzmi nr. Oprócz wywołania update
, prepareGeometryChange
zaznacza jako brudny obszar elementu na scenie, powodując odświeżenie samego regionu. Z mojego doświadczenia wynika, że wystarczało to w 100% przypadków, więc nie musiałem wywoływać aktualizacji().
bardziej ogólnie, można precyzyjnie go wywołać za każdym razem, gdy zmienia się obliczenia ':: boundingRect()'. Twój przykład jest jednak dobry. – azf
Dzięki za odpowiedź. Nadal się zastanawiam * jak * działa. Na przykład, kiedy wywołuje funkcję update()? – Anthony
odpowiedź zaktualizowana, mam nadzieję, że to pomoże. – Masci