Struktureret grafik med QCanvas

QPainter tilbyder en kraftfuld tegnemodel til at tegne på grafiske kontroller og pixmaps. Den kan dog være omstændelig at bruge. Hver gang kontrollen modtager en tegnebegivenhed, skal den analysere QPaintEvent::region() eller QPaintEvent::rect() for det som skal tegnes om. Derefter skal den indstille en QPainter, og tegne alle objekter som overlapper dette område. Tænk for eksempel på et vektortegneprogram som tillader at objekter såsom polygoner, cirkler og grupper af dem at trækkes omkring. Hver gang objekterne flyttes en lille smule, aktiverer kontrolles musebegivenhedshåndtering en tegnebegivenhed for hele området som dækkes af objekternes gamle sted og deres nye sted. At regne de nødvendige omtegninger ud, og at udføre dem på en effektiv måde, kan være svært, og kan også være i konflikt med programkodens objektorienterede struktur.

Som et alternativ indeholder Qt klassen QCanvas, hvor man tilføjer grafiske objekter, såsom polygoner, tekst eller pixmaps. Man kan også oprette yderligere objekter ved at oprette en delklasse af QCanvasItem eller en af dens mere specialiserede delklasser. En dug kan vises på skærmen ved en eller flere kontroller fra klassen QCanvasView, som man skal oprette en delklasse af for at håndtere interaktion med brugeren. Qt sørger for al omtegning af objekter i visningen, det være sig de forårsages af at kontrollen vises, nye objekter laves eller ændres, eller andre grunde. Ved at bruge dobbeltbuffering, kan dette gøres på en effektiv og flimmerfri måde.

Objekter på dugen kan overlappe hinanden. I dette tilfælde, så afhænger det der ses af z-rækkefølgen, som kan tildeles med QCanvasItem::setZ(). Objekter kan også gøres synlige eller usynlige. Man kan også sørge for en baggrund som skal tegnes "bagved" alle objekter, og en forgrund. For at associere musebegivenheder med objekter på dugen, findes metoden QCanvas::collisions(), som returnerer en liste med objekter som overlappar med et givet punkt. Her viser vi et skærmaftryk af en dugvisning i arbejde:



Her optegnes rudemønstret i baggrunden. Desuden findes et QCanvasText-objekt og en violet QCanvasPolygon. Sommerfuglen er en QCanvasPixmap. Den har gennemsigtige områder, så du kan se underliggende objekt gennem den.

En vejledning om hvordan QCanvas bruges til at skrive spil baserede på småfigurer findes her.