2012-03-23 9 views
10

Zgodnie z dokumentacją Qt, "Przygotowuje element do zmiany geometrii, wywołaj tę funkcję przed zmianą prostokątu ograniczającego elementu, aby utrzymać aktualność indeksu QGraphicsScene, a metoda prepareGeometryChange() wywoła funkcję update(), jeśli jest to konieczne. "Jak działa QGraphicsItem :: prepareGeometryChange()?

Nie rozumiem, jak QGraphicsItem wie, kiedy zmienia się rect, i jak wie, kiedy wywołać update(). Czy powinieneś kiedyś wywołać funkcję update() po wywołaniu metody prepareGeometryChange(), a następnie zmianie prostokąta ograniczającego?

Byłbym bardzo wdzięczny za wgląd w coś, co wydaje się być metodą jasnowidzącą.

Odpowiedz

15
  • 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:

  1. jeśli ktoś jest podłączony do sygnału
  2. 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().

+1

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

+0

Dzięki za odpowiedź. Nadal się zastanawiam * jak * działa. Na przykład, kiedy wywołuje funkcję update()? – Anthony

+0

odpowiedź zaktualizowana, mam nadzieję, że to pomoże. – Masci