Qt logo


Kapitola 9: S kanónom môžeme


Screenshot of tutoriálu č. nine

V tomto príklade používame po prvý krát triedu QPainter. Používame ju na nakreslenie pekného malého modrého kanóna. Od predchádzajúcej kapitoly sa líši len cannon.cpp.

Prechádzka riadok po riadku

cannon.cpp

    void CannonField::paintEvent( QPaintEvent * )
    {
        QPainter p;
        QBrush   brush( blue );
        QPen     pen( NoPen );

Aby sme mohli nakresliť náš widget, použijeme triedu QPainter. Trieda QPainter je Qt kresliaci stroj. Vie renderovať 2D grafiku na niekoľkých typoch kresliacich zariadení. QWidget je kresliace zariadenie. Detaily viď dokumentácia triedy QPainter.

QPainter používa QPen a QBrush. QPen (pero) špecifikuje štýl čiary a farbu textu, QBrush (štetec) farbu a/alebo vzorku výplne. V našej obsluhe udalosti paintEvent chceme použiť modrý štetec a neviditeľné pero.

        p.begin( this );

Volanie funkcie begin() povie painteru, aby začal kresliť na kresliace zariadenie. Tu začíname kresliť na widget CannonField.

        p.setBrush( brush );
        p.setPen( pen );

Tu nastavíme pero a štecec vytvorené vyššie.

        p.translate( 0, rect().bottom() );

Funkcia translate() preloží súradnicový systém, t.j. posunie ho o offset. Tu nastavíme bod (0,0) do ľavého dolného rohu widgetu. Smery x a y ostávajú nezmenené, tzn. že všetky súradnice y vo vnútri widgetu sú teraz záporné (viď systém súradníc).

        p.drawPie( QRect(-35, -35, 70, 70), 0, 90*16 );

Funkcia drawPie() kreslí kruhový výsek v zadanom obdĺžniku použijúc počiatočný a koncový uhol. Uhly sú špecifikované v šestnástinách (1/16) stupňa. Nula stupňov je na pozícii číslice 3 na ciferníku hodín. Smer kreslenia je proti smeru hodinových ručičiek. Tu kreslíme štvrťkruh v ľavom dolnom rohu widgetu. Štvrťkruh je modrý a nemá okrajovú čiaru.

        p.rotate( -ang );

Funkcia rotate() otočí súradnicový systém objektu QPainter okolo bodu (0,0). Argument funkcie je desatinné číslo (float) v stupňoch (nie v šestnástinách stupňa ako vyššie) v smere hodinových ručičiek. Tu otočíme súradnicový systém o ang stupňov proti smeru hodinových ručičiek.

        p.drawRect( QRect(33, -4, 15, 8) );

Funkcia drawRect() kreslí zadaný obdĺžnik. Takto nakreslíme hlaveň nášho kanóna.

Je často zložité predvídať výsledok kreslenia po transformácii súradnicového systému (posunutí, otočení, zmene mierky alebo "sheared"), akú sme urobili vyššie.

Tentokrát je systém súradníc najprv posunutý a potom otočený. Ak by bol obdĺžnik QRect(33, -4, 15, 8) nakreslený v posunutom súradnicovom systéme, vyzeral by nejako takto:

Kanón, posunutý, ale neotočený

Všimnite si, že obdĺžnik je orezaný okrajom widgetu CannonField. Keď otočíme súradnicový systém, napríklad o 60 stupňov, obdĺžnik bude otočený okolo bodu (0,0), ktorý je v ľavom dolnom rohu, pretože sme posunuli súradnicový systém. Výsledok vyzerá nejako takto:

Kanón, posunutý a otočený

        p.end();

Volanie end() povie painteru, že sme skončili s kreslením na kresliace zariadenie. Sme hotoví, teda až na to, že sme nevysvetlili, prečo tentokrát Windows neditherujú farby.

    int main( int argc, char **argv )    {
        QApplication::setColorSpec( QApplication::CustomColor );

Povieme Qt, že chceme v tomto programe inú stratégiu pre alokovanie farieb. Neexistuje jedna správna stratégia alokovania farieb. Niektoré stratégie vyzerajú dobre v určitých programoch, v iných zase iné.

Stratégia CustomColor dá Qt aplikáciám lepšie farby vo Windows. Nemá žiadny efekt pod X11. Je niekoľko ďalších možností. Môžete si o nich prečítať v dokumentácii.

Správanie

Keď pohnete s rolovacou lištou, mení sa zároveň ukol námeru kanóna.

Môžete si všimnúť, že kanón nepríjemne bliká, obzvlášť na pomalších počítačoch. Opravíme to v ďalšej kapitole.

Cvičenia

Nastavte do pozadia widgetu CannonField obrázok.

Teraz môžete ísť na kapitolu desať.

[Predchádzajúci tutoriál] [Ďalší tutoriál] [Hlavná stránka tutoriálu]


Copyright © 1998 Troll TechTrademarks
Qt version 1.42