Animerte gjenstander som bruker delegater og filmer.

Animerte gjenstander som bruker delegater og filmer.

Dette eksemplet viser hvordan du bruker en egendefinert delegat med en animasjon for a indikere at et element er opptatt, eller kanskje venter pa flere data.

For enkelhets skyld bruker vi igjen QStandardItemModel og QStandardItem. Virkelige verden modeller kan bli fullstendig implementert fra grunnen av underklasse QAbstractItemModel eller en av sine underklasser.

For a produsere opptatte elementer, oppretter vi QStandardItem-forekomster, noe som vi endrer ved a sette sine UserRole-roller til True, som indikerer at de venter pa noe.

Vi subklasse QStandardItemModel slik at vi kan undersoke elementer som de blir lagt til i modellen. Vi lager timere for a vente pa elementer for a simulere noe forsinkelse med a skaffe data, og vi holder oye med de tilknyttede elementene, slik at vi kan endre tilstandene deres nar timeren gar.

Delegateklassen bruker en QMovie-forekomst for a generere bilder som skal vises for ventende elementer. Vi lager et tilpasset signal, trengerRedraw, som vi sender ut hver gang filmen endrer sin nav rende ramme.

Vi implementerer malingen () -metoden til delegaten, justerer regionen der delegaten tegner sitt vanlige innhold, og vi tegner en pixelmappe i venstre ende av elementet. Vi avslutter ved a ringe basklassens implementering av paint () -metoden slik at resten av elementet er malt normalt.

Tilpasningen til modellklassen er minimal. Vi gir et tilpasset signal, ferdig, slik at vi kan informere andre komponenter nar alle ventende gjenstander er ferdige, og vi beholder en ordbok som kartlegger timere til ventende elementer.

Ved a implementere appendRow () -metoden, oppretter vi timere for elementer som venter (de har deres UserRole satt til True), og lagrer dem i pendingItems Dictionary. Hver timers tidsavbruddssignal er koblet til checkPending () -sporet.

Denne metoden henter bare det tilsvarende elementet for hver timer og oppdaterer sin tilstand slik at delegaten ikke lenger viser det som et ventende element. Den sletter deretter ordboksposten (og tidtakeren, siden det er ordliste nokkelen). Hvis ingen gjenstander forblir i ordboken, sender vi det ferdige signalet.

Vi vil kanskje v re mer forsiktige med ting her. For eksempel ma vi kanskje handtere dem annerledes hvis de er fjernet fra modellen.

Opprettelsen av modellen og elementene er som beskrevet i oversikten. Vi lager en standardvisning og en forekomst av var egendefinerte modell, som vi fyller med standardelementer, sorg for a markere noen av dem som ventende varer.

Delegasjonen er satt opp med en animasjon (se animasjon.mng) og dens behovRedraw-signalet er koblet til oppdateringen () -sporet i visningsporten – ved hjelp av visningsoppdateringen () er ikke tilstrekkelig, virker det. Vi starter filmen.

Vi kobler modellens ferdige spor til delegatens stopMovie () –spor – det er ikke noe poeng i a kjore filmen hvis det ikke er noen ting som venter – og til den aktuelle oppdateringen () -sporet.

Na kan vi vise visningen og starte hendelseslokken.

Konklusjoner.

Dette ser ut til a virke ganske bra, og det bor v re mulig a skrive flere abstrakte modeller som faktisk ma vente pa data, men jeg er ikke fornoyd med a ha mange lavnivaforbindelser mellom komponentene. Kanskje jeg skal bruke teknikken til en ekte verdensmodell og lage et nytt eksempel basert pa min erfaring.

PyQt / Animerte gjenstander som bruker delegater og filmer (sist redigert 2014-06-07 16:38:10 av DavidBoddie)