Qt QGraphicsScene- odświeżanie widoku sceny w każdej iteracji

0

Witam,
piszę program graficzny w Qt, w którym to obrazek ma się płynnie ruszać, powiedzmy koło ma dwukrotnie powiększyć swoją średnicę. Utworzyłem sobie klasę scena, która dziedziczy po QGraphicsScene, w jej konstruktorze rysuję tło i różne figury geometryczne, dodaję je do sceny. Następnie,już w funkcji main() scenę wrzucam do obiektu klasy QGraphicsView, która przy użyciu QApplication mój zaplanowany obrazek wyświetla. Do tego momentu wszystko jest spoko. Później przy pomocy QTimer po 5 sekundach wywołuję slot dla sceny - powiększKoło(), której kod podaję niżej i tu już pojawia się problem:

    
    for(int i=0 ; i<=100 ; i++)
    {
       removeItem(kolo);  //usuwam stare kolo o wymiarach 100x100
       kolo = new QGraphicsEllipseItem(0, this); //tworze nowe kolo
       kolo->setRect(0,0,100+i,100+i); 
       usleep(10000); //czekam 10ms czyli cała operacja powinna zająć 100x10ms = 1s
       update(); //co iterację updatuję!
    }

I moim problemem jest, że widzę koło narysowane już w konstruktorze, po 5sekundach QTimer się wywołuje(na pewno, sygnalizuje sobie to w cout) i po sekundzie widze nowe koło, o wymiarach 200x200. Zero efektu 'powiększania' koła. Sądzę, że z update() robię coś nie tak, tzn że nie jest to wystarczająca metoda, ale jestem dość zielony w Qt i czytam helpa i czytam i nic pomocnego nie mogę znaleźć. Liczę na jakieś wskazówki :)
pozdrawiam!
"

1

Zrób innaczej.Niech animacją steruje w całości QTimer,a w slocie miałbyś tylko to:

void enlargeEllipse(void)
{
    QRectF r=kolo->rect();
    r.setWidth(r.width()+ENLARGE_FACTOR);
    r.setHeight(r.height()+ENLARGE_FACTOR);
    kolo->setRect(r);
}

Interwał timera ustaw sobie na 1 sekundę.

0

Działa świetnie! Tylko interwał ustawiłem na 10ms i przy startowaniu Timera dodatkowo ustawiłem metodę:
timer->singleShot(1000, timer, SLOT(stop()));
Czyli, że jednorazowo po upływie 1 sekundy (1s/10ms = 100, odpowiednik ilości moich iteracji w pierwotnym zamyśle) timer sam siebie wyłącza
Dzięki, bez tego bym nie ruszył dalej. A mógłbyś może jeszcze napisać, czemu samo wywoływanie update(), tak jak to robiłem w pierwszym poście, nie działało prawidłowo?

1

Co mi się nie podobało w twoim kodzie:
-usuwanie i tworzenie nowego koła - całkowicie zbędne jak widzisz,skoro chodzi ci tylko o efekt zmiany prostokąta elipsy.
-usleep - usleep i QTimer??Kiepskie połączenie,i zbyteczne jak się ma już QTimera.
Po powyższym już nie chciało mi się analizować co to tam dokładnie jest nie tak,i zamiast tego zapodałem ci sposób w jaki ja bym to napisał.

Btw,poproś moda madmike'a o pyknięcie ptaszka przy poście,który uznajesz za pomocny ;)

UO,mój następny post będzie zaiste szatański! :]

1 użytkowników online, w tym zalogowanych: 0, gości: 1