Home

Klasy - Adnotacje - Drzewo - Funkcje - Powrót - Struktura

Rozdział 9: Potrzebujesz działa

Screenshot of tutorial nine

W tym przykładzie staniemy się bardziej graficzni dzięki narysowaniu małego niebieskiego działa. Jedynie cannon.cpp różni się od poprzedniego rozdziału.

Analiza kodu linia po linii

cannon.cpp

    void CannonField::paintEvent( QPaintEvent * )
    {
        QPainter p( this );
Na serio zaczniemy teraz używac QPainter. Utworzymy rysownika, który operuje na tym widgecie.
        p.setBrush( blue );
Kiedy QPainter wypełnia czworokąt lub okrąg lub cokolwiek, wypełnia jego kształt przy użyciu swojego pędzla. Tutaj ustawiamy kolor pędzla na niebieski. (Moglibyśmy także użyć wzoru.)
        p.setPen( NoPen );
Brzegi tego co rysuje QPainter rysowane są przy użyciu pióra. Tutaj ustawiamy je na NoPen, co oznacza, że nie bedziemy malowac czegoś specjalnego na brzegach. Niebieski pędzel pokryje więc także brzegi
        p.translate( 0, rect().bottom() );
Funkcja QPainter::translate() system koordynatów QPainter, tzn. przesuwa go o ofset. W naszym przykładzie ustawimy punkt (0,0) na sole z lewej strony widgetu. Kierunki x i y pozostają bez zmian, tzn. wszystki koordynaty y w widgecie są teraz ujemne (patrz The Coordinate System).
        p.drawPie( QRect(-35, -35, 70, 70), 0, 90*16 );
Funkcja drawPie() rysuje wycinek koła w wskazanym prostokącie używając jako argumentów kąta początkowego oraz długości kąta. Kąty to 1/16th stopnia. Zero stopni jest na trzeciej godzinie zegara. Kierunek rysowania jest zgodny z kierunkiem wskazówek zegara.  Wycinek jest wypełniony niebieskim kolorem i nie ma obramowania.
        p.rotate( -ang );
Funkcja QPainter::rotate() przekręca system koordynatów QPainter wokół początku. Argumentem obrotu jest float podany w stopniach (a nie w 1/16th stopnia jak wyżej) i zgodny z kierunkiem wskazówek zegara. Tutaj obracamy system koordynatów ang stopni.
        p.drawRect( QRect(33, -4, 15, 8) );
Funkcja QPainter::drawRect() rysuje prostokąt. w ten sposób narysujemy lufę działa.

W naszym przypadku, system koordynatów jest najpierw tłumaczony, a następnie obracany. jeśli prostokąt QRect(33, -4, 15, 8) miałby zostać narysowany w przetłumaczonym systemie koordynatów, wyglądałby tak:

The cannon, translated but not rotated

Zauważ, ze prostokąt jest obcinany przez ramkę widgetu CannonField. Kiedy obracamy system koordynatów, na przykład o 60 stopni, prostokąt zostanie obrócony według (0,0), co jest dolnym lewym punktem, ponieważ przetłumaczyliśmy system kkoordynatów. Będzie to wyglądało tak:

The cannon, translated and rotated

A więc to koniec, wyjaśnimy dlaczego pod Windowswygląda to znośnie:

    int main( int argc, char **argv )
    {
        QApplication::setColorSpec( QApplication::CustomColor );
        QApplication a( argc, argv );
Powiedzieliśmy Qt, iż chcemy innej strategii alokacji kolorów.W tym przypadku najlepszy jest CustomColor. O innych strategiach poczytaj w QApplication::setColorSpec().
 

Zachowanie

Kiedy przesuwamu suwak kąt rysowanego działa zmienia się odpowiednio.

Q na przycisku Quit jest teraz podkreślone, a Alt-Q robi to co powinno. Jeśli nie wiesz dlaczego wróć do rozdziału ósmego.

Byc może działo będzie migotać, szczególnie na słabszych maszynach. Naprawimy to w następnym rozdziale.

Ćwiaczenia

Wybierz inną wartośc na NoPen. Wybierz wzór dla pędzla.

Wypróbuj "Q&uit" lub "Qu&it" jako tekst dla przycisku "&Quit" - co się dzieje ?

Możesz udać się teraz do rozdziału dziesiątego.

[Poprzedni tutorial] [Następny tutorial] [Głowna strona tutoriala]



 
Copyright (c) 2000 Troll Tech Znaki towarowe
Wersja Qt 2.1.0