Kehitys/Oppikurssit/Qt4 Ruby -oppikurssil/Kappale 05

From KDE TechBase
Revision as of 18:53, 4 September 2011 by Centerlink (talk | contribs) (Created page with "Ehkä olisi parempi käyttää komponenttia [http://doc.qt.nokia.com/latest/qspinbox.html Qt::SpinBox] kuin liukukytkintä?")
Other languages:


Development/Tutorials/Qt4 Ruby Tutorial/Chapter 05


Rakentamislohkot
Tutorial Series   Qt4 Ruby -oppikurssi
Previous   Oppikurssi 4 - Olkoon siinä käyttöliittymäkomponentti
What's Next   Oppikurssi 6 - Rakentamislohkot Galore!
Further Reading   n/a

Rakentamislohkot

Tiedostot:

Yleiskuva

Tämä esimerkki näyttää kuinka useita käyttöliittymäkomponentteja luodaan ja yhdistetään yhteen käyttäen signaaleja ja aikavälejä, ja kuinka koon muuttamisia käsitellään.

require 'Qt4'

class MyWidget < Qt::Widget
  def initialize()
    super()
    quit = Qt::PushButton.new('Poistu')
    quit.setFont(Qt::Font.new('Times', 18, Qt::Font::Bold))
    
    lcd = Qt::LCDNumber.new(2)

    slider = Qt::Slider.new(Qt::Horizontal)
    slider.setRange(0, 99)
    slider.setValue(0)

    connect(quit, SIGNAL('clicked()'), $qApp, SLOT('quit()'))
    connect(slider, SIGNAL('valueChanged(int)'), lcd, SLOT('display(int)'))

    layout = Qt::VBoxLayout.new()
    layout.addWidget(quit)
    layout.addWidget(lcd)
    layout.addWidget(slider)
    setLayout(layout)
  end
end

app = Qt::Application.new(ARGV)

widget = MyWidget.new()

widget.show()
app.exec()

Läpikäynti rivi riviltä

    lcd = Qt::LCDNumber.new(2)

lcd on Qt::LCDNumber, käyttöliitymäkomponentti, joka näyttää numeroita nestekidenäytön tyyppisesti. Tämä ilmentymä on asetettu näyttämään kahta numeroa.

slider = Qt::Slider.new(Qt::Horizontal)
slider.setRange(0, 99)
slider.setValue(0)

Käyttäjä voi käyttää Qt::Slider -käyttöliittymäkomponenttia säätämään kokon aislukuarvon lukualueella. Tässä luomme vaakasuoran komponentin, asetetaan sen minimiarvoksi 0, sen maksimiarvoksi 99, ja sen alkuarvoksi 0.

    connect(slider, SIGNAL('valueChanged(int)'), lcd, SLOT('display(int)'))

Tässä käytämme signaalit ja aikavälit -mekanismia liukukytkimen kytkemiseksi QAbstractSlider::valueChanged() -signaaliin nestekidenumeronäytön display() -aikavälissä.

Milloin tahansa liukukytkimen arvo muuttuu, se lähettää uuden arvon QAbstractSlider::valueChanged() -signaalilla. Koska tuo signaali on yhdistetty nestekidenäytön numeroiden QLCDNumber::display() -aikaväliin, aikaväliä kutsutaan, kun signaalia lähetetään. Kumpikaan komponenteista ei tiedä toisesta. Tämä on olennaista komponenttiohjelmoinnissa.

layout = Qt::VBoxLayout.new()
layout.addWidget(quit)
layout.addWidget(lcd)
layout.addWidget(slider)
setLayout(layout)

MyWidget nyt käyttää komponenttia Qt::VBoxLayout hallinnoimaan sen tytärkäyttöliittymäkomponentin geometriaa. Siitä syystä meidän ei tarvitse määritellä näytön koordinaatteja jokaiselle käyttöliitymäkomponentille, kuten teimme kappaleessa 4. Sen lisäksi, asettelun käyttäminen varmistaa, että tytärkomponentin koko muuttuu, kun käyttöliittymäkomponentin kokoa muutetaan. Lisäämme sitten quit-, lcd-, ja slider-käyttöliittymäkomponentit asetteluun käyttäen komponenttimetodia Qt::BoxLayout::addWidget().

Qt::Widget::setLayout()-funktio asentaa asettelun kohteelle MyWidget. Tämä tekee asettelusta käyttöliittymäkomponentin MyWidget tytärkomponentin, joten meidän ei tarvitse huolehtia sen poistamisestat; se poistetaan yhdessä käyttöliittymäkomponentin MyWidget:n kanssa. Myös kutsu kohteeseen Qt::Widget::setLayout() muodostaa automaattisesti käyttöliittymäkomponentin emo-tytärsuhteen niin että se on MyWidget:n tytär. Tästä syystä meidän ei tarvitse määritellä käyttöliitymäkomponenttia self komponenttien quit, lcd, ja slider emoksi.

Qt:ss' käyttöliittymäkomponentit ovat joko muiden käyttöliittymäkomponenttien tyttäriä (esim.: self), tai niillä ei ole emoa. Käyttöliittymäkomponentti voidaan lisätä asetteluun, missä tapauksessa asettelu tulee velvoliseksi hallitsemaan asettelun geometriaa, mutta asettelu ei voi koskaan itse toimia emona. Todellisuudessa käyttöliittymäkomponentin Qt::Widget konstruktori ottaa osoittimen Qt::Widget emoon, ja Qt::Layout ei peri kohteesta Qt::Widget.

Sovelluksen suorittaminen

Nestekidenäytön numero heijastaa kaiken, mitä teet liukukytkimelle, ja käyttöliittymäkomponentti käsittelee myös koon muuttamisen. Huomaa, että nestekidenäyttönumerokäyttöliittymäkomponentti muuttaa kokoa, kun ikkunan kokoa muutetaan (koska se voi tehdän niin), mutta muut jäävät samoiksi (koska muuten ne näyttävät oudoilta).

Harjoitukset

Yritä muuttaa nestekidenäyttönumeroita lisäämällä lisää numeroita tai muuttamalal tilaa (Qt::LCDNumber::setMode()). Voit myös lisätä neljä painiketta kantaluvun asettamiseksi.

Voit myös vaihtaa liukukytkimen lukualuetta.

Ehkä olisi parempi käyttää komponenttia Qt::SpinBox kuin liukukytkintä?

Try to make the application quit when the LCD number overflows.