Kehitys/Oppikurssit/Qt 4 oppikurssi/Kappale 10

    From KDE TechBase
    Revision as of 14:24, 18 July 2012 by FuzzyBot (talk | contribs) (Updating to match new version of source page)
    (diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
    Other languages:


    Sileää kuin silkki
    Tutorial Series   Qt4 Ruby -oppikurssi
    Previous   Oppikurssi 9 - Kanuunalla onnistuu
    What's Next   Oppikurssi 11 - Annetaan sille laukaus
    Further Reading   n/a

    Sileää kuin silkki

    Tiedostot:

    Yleiskuva

    Tässä esimerkissä lisäämme voimaa ohjaimeen.

    Läpikäynti rivi riviltä

    cannon.rb

    Kentällä CannonField on nyt voima-arvo kulman lisäksi.

    signals 'angleChanged(int)', 'forceChanged(int)'
    slots 'setAngle(int)', 'setForce(int)'
    

    Voiman rajapinta noudattaa samaa käytäntöä kuin kulma.

    def initialize(parent = nil)
      super()
    
      @currentAngle = 45
      @currentForce = 0
    
      setPalette(Qt::Palette.new(Qt::Color.new(250, 250, 200)))
      setAutoFillBackground(true)
    end
    

    Voima @currentForce on alustettu nollaksi.

    def setAngle(angle)
      if angle < 5
        angle = 5
      elsif angle > 70
        angle = 70
      end
    
      if @currentAngle == angle
        return
      end
    
      @currentAngle = angle
      update(cannonRect())
      emit angleChanged(@currentAngle)
    end
    

    Teimme pienen muutoksen setAngle()-funktioon. Se piirtää uudelleen käyttöliittymän osan, joka sisältää kanuunan.

    def setForce(force)
      if force < 0
        force = 0
      end
      if @currentForce == force
        return
      end
    
      @currentForce = force
      emit forceChanged(@currentForce)
    end
    

    setForce()-toteutus on aika samanlainen kuin setAngle(). Ainoa erilaisuus on, että koska emme näytä voima-arvoa, käyttöliittymäkomponenttia ei tarvitse piirtää uudelleen.

    def paintEvent(event)
      painter = Qt::Painter.new(self)
    
      painter.setPen(Qt::NoPen)
      painter.setBrush(Qt::Brush.new(Qt::blue))
    
      painter.translate(0, height())
      painter.drawPie(Qt::Rect.new(-35, -35, 70, 70), 0, 90 * 16)
      painter.rotate(-@currentAngle)
      painter.drawRect(Qt::Rect.new(30, -5, 20, 10))
      painter.end()
    end
    

    Piirrämme kuin kappaleessa 9.

    def cannonRect()
      result = Qt::Rect.new(0, 0, 50, 50)
      result.moveBottomLeft(rect().bottomLeft())
      return result
    end
    

    Funktio cannonRect() palauttaa nelikulmion, joka sisältää kanuunan sisältävän käyttöliittymäkomponentin. Luomme aluksi nelikulmion, jonka koko on 50 x 50 ja siirrämme sen niin, että sen vasen alakulma on sama kuin käyttöliittymäkomponentin vasen alakulma.

    Funktio Qt::Widget::rect() palauttaa käyttöliittymän sisältämän nelikulmion käyttöliittymän omina koordinaatteina. Nelikulmion vasen yläkulma on aina (0, 0).

    t10.rb

    Konstruktori on enimmäkseen sama, mutta joitakin uusia bittejä on lisätty.

    force = LCDRange.new()
    force.setRange(10, 50)
    

    Lisäämme toisen LCDRange-komponentin, jota käytetään voiman asettamiseen.

    connect(force, SIGNAL('valueChanged(int)'),
             cannonField, SLOT('setForce(int)'))
    connect(cannonField, SIGNAL('forceChanged(int)'),
             force, SLOT('setValue(int)'))
    

    Yhdistämme käyttöliittymäkomponentin force ja käyttöliittymäkomponentin cannonField, aivan kuin teimme käyttöliittymäkomponentille angle.

    leftLayout = Qt::VBoxLayout.new()
    leftLayout.addWidget(angle)
    leftLayout.addWidget(force)
    
    gridLayout = Qt::GridLayout.new()
    gridLayout.addWidget(quit, 0, 0)
    gridLayout.addLayout(leftLayout, 1, 0)
    gridLayout.addWidget(cannonField, 1, 1, 2, 1)
    gridLayout.setColumnStretch(1, 10)
    

    Kappaleessa 9 sijoitamme angle-komponentin asettelun vasemman alakulman soluun. Nyt haluamme siihen soluun kaksi käyttöliittymäkomponenttial, joten teemme pystysuoran ruudun, laitamme pystysuoran ruudun rasterinsoluunl, ja laitamme sekä angle että range pystysuoraan ruutuun.

    force.setValue(25)
    

    Alustamme voima-arvoksi 25.

    Sovelluksen suorittaminen

    Meillä on nyt voimaohjaus.

    Harjoitukset

    Tee kanuuna piipun koko riippuvaiseksi voimasta.

    Laita kanuuna oikeaan alakulmaan.

    Yritä lisätä parempi näppäimistörajapinta. Esimerkiksi, tee + ja - kasvattamaan ja pienennättämään voimaa ja laukaisemaan kanuunan. Jos olet vaivautunut tavasta, jolla näppäimet Left ja Right toimivat, muuta sitä myös. [Vihje: Toteuta uudelleen Qt::Widget::keyPressEvent().]