Development/Tutorials/Qt4 Ruby Tutorial/Chapter 05/fi: Difference between revisions

From KDE TechBase
(Created page with "== Rakentamislohkot ==")
(Updating to match new version of source page)
 
(19 intermediate revisions by one other user not shown)
Line 1: Line 1:
<languages />
<languages />


{{Template:I18n/Language Navigation Bar|Development/Tutorials/Qt4 Ruby Tutorial/Chapter 05}}
 


{{TutorialBrowser|
{{TutorialBrowser|
Line 13: Line 13:
[[Image:Qt4_Ruby_Tutorial_Screenshot_5.png|center]]
[[Image:Qt4_Ruby_Tutorial_Screenshot_5.png|center]]


Files:
Tiedostot:
* [http://www.darshancomputing.com/qt4-qtruby-tutorial/tutorial/t5/t5.rb t5.rb]
* [http://www.darshancomputing.com/qt4-qtruby-tutorial/tutorial/t5/t5.rb t5.rb]


=== Overview ===
=== Yleiskuva ===


This example shows how to create and connect together several widgets by using signals and slots, and how to handle resizes.
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.


<syntaxhighlight lang="ruby">
<syntaxhighlight lang="ruby">
Line 26: Line 26:
   def initialize()
   def initialize()
     super()
     super()
     quit = Qt::PushButton.new('Quit')
     quit = Qt::PushButton.new('Poistu')
     quit.setFont(Qt::Font.new('Times', 18, Qt::Font::Bold))
     quit.setFont(Qt::Font.new('Times', 18, Qt::Font::Bold))
      
      
Line 54: Line 54:
</syntaxhighlight>
</syntaxhighlight>


=== Line by Line Walkthrough ===
=== Läpikäynti rivi riviltä ===
<syntaxhighlight lang="ruby">
<syntaxhighlight lang="ruby">
     lcd = Qt::LCDNumber.new(2)
     lcd = Qt::LCDNumber.new(2)
</syntaxhighlight>
</syntaxhighlight>


'''<tt>lcd</tt>''' is a [http://doc.qt.nokia.com/latest/qlcdnumber.html Qt::LCDNumber], a widget that displays numbers in an LCD-like fashion. This instance is set up to display two digits.  
'''<tt>lcd</tt>''' on [http://doc.qt.nokia.com/latest/qlcdnumber.html 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.  


<syntaxhighlight lang="ruby">
<syntaxhighlight lang="ruby">
Line 67: Line 67:
</syntaxhighlight>
</syntaxhighlight>


The user can use the [http://doc.qt.nokia.com/latest/qslider.html Qt::Slider] widget to adjust an integer value in a range. Here we create a horizontal one, set its minimum value to 0, its maximum value to 99, and its initial value to 0.  
Käyttäjä voi käyttää [http://doc.qt.nokia.com/latest/qslider.html 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.  


<syntaxhighlight lang="ruby">
<syntaxhighlight lang="ruby">
Line 73: Line 73:
</syntaxhighlight>
</syntaxhighlight>


Here we use the [http://doc.qt.nokia.com/latest/signalsandslots.html signals and slots] mechanism to connect the slider's  [http://doc.qt.nokia.com/latest/qabstractslider.html#valueChanged QAbstractSlider::valueChanged()] signal to the LCD number's display() slot.  
Tässä käytämme [http://doc.qt.nokia.com/latest/signalsandslots.html signaalit ja aikavälit] -mekanismia liukukytkimen kytkemiseksi [http://doc.qt.nokia.com/latest/qabstractslider.html#valueChanged QAbstractSlider::valueChanged()] -signaaliin nestekidenumeronäytön display() -aikavälissä.  


Whenever the slider's value changes it broadcasts the new value by emitting the [http://doc.qt.nokia.com/latest/qabstractslider.html#valueChanged QAbstractSlider::valueChanged()] signal. Because that signal is connected to the LCD number's [http://doc.qt.nokia.com/latest/qlcdnumber.html#intValue-prop QLCDNumber::display()] slot, the slot is called when the signal is broadcast. Neither of the objects knows about the other. This is essential in component programming.  
Milloin tahansa liukukytkimen arvo muuttuu, se lähettää uuden arvon [http://doc.qt.nokia.com/latest/qabstractslider.html#valueChanged QAbstractSlider::valueChanged()] -signaalilla. Koska tuo signaali on yhdistetty nestekidenäytön numeroiden [http://doc.qt.nokia.com/latest/qlcdnumber.html#intValue-prop QLCDNumber::display()] -aikaväliin, aikaväliä kutsutaan, kun signaalia lähetetään. Kumpikaan komponenteista ei tiedä toisesta. Tämä on olennaista komponenttiohjelmoinnissa.  


<syntaxhighlight lang="ruby">
<syntaxhighlight lang="ruby">
Line 85: Line 85:
</syntaxhighlight>
</syntaxhighlight>


'''<tt>MyWidget</tt>''' now uses a [http://doc.qt.nokia.com/latest/qvboxlayout.html Qt::VBoxLayout] to manage the geometry of its child widgets. For that reason, we don't need to specify the screen coordinates for each widget like we did in Chapter 4. In addition, using a layout ensures that the child widgets are resized when the window is resized. Then we add the '''<tt>quit</tt>''', '''<tt>lcd</tt>''', and '''<tt>slider</tt>''' widgets to the layout using [http://doc.qt.nokia.com/latest/qboxlayout.html#addWidget Qt::BoxLayout::addWidget()].  
'''<tt>MyWidget</tt>''' nyt käyttää komponenttia [http://doc.qt.nokia.com/latest/qvboxlayout.html 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 '''<tt>quit</tt>'''-, '''<tt>lcd</tt>'''-, ja '''<tt>slider</tt>'''-käyttöliittymäkomponentit asetteluun käyttäen komponenttimetodia [http://doc.qt.nokia.com/latest/qboxlayout.html#addWidget Qt::BoxLayout::addWidget()].  


The [http://doc.qt.nokia.com/latest/qwidget.html#setLayout Qt::Widget::setLayout()] function installs the layout on '''<tt>MyWidget</tt>'''. This makes the layout a child widget of '''<tt>MyWidget</tt>''' so we don't have to worry about deleting it; it will be deleted together with '''<tt>MyWidget</tt>'''. Also, the call to [http://doc.qt.nokia.com/latest/qwidget.html#setLayout Qt::Widget::setLayout()] automatically reparents the widgets in the layout so that they are children of '''<tt>MyWidget</tt>'''. Because of this, we didn't need to specify '''<tt>self</tt>''' as the parent for the '''<tt>quit</tt>''', '''<tt>lcd</tt>''', and '''<tt>slider</tt>''' widgets.  
[http://doc.qt.nokia.com/latest/qwidget.html#setLayout Qt::Widget::setLayout()]-funktio asentaa asettelun kohteelle '''<tt>MyWidget</tt>'''. Tämä tekee asettelusta käyttöliittymäkomponentin '''<tt>MyWidget</tt>''' tytärkomponentin, joten meidän ei tarvitse huolehtia sen poistamisestat; se poistetaan yhdessä käyttöliittymäkomponentin '''<tt>MyWidget</tt>''':n kanssa. Myös kutsu kohteeseen [http://doc.qt.nokia.com/latest/qwidget.html#setLayout Qt::Widget::setLayout()] muodostaa automaattisesti käyttöliittymäkomponentin emo-tytärsuhteen niin että se on '''<tt>MyWidget</tt>''':n tytär. Tästä syystä meidän ei tarvitse määritellä käyttöliitymäkomponenttia '''<tt>self</tt>''' komponenttien '''<tt>quit</tt>''', '''<tt>lcd</tt>''', ja '''<tt>slider</tt>''' emoksi.  


In Qt, widgets are either children of other widgets (e.g. '''<tt>self</tt>'''), or they have no parent. A widget can be ''added'' to a layout, in which case the layout becomes responsible for managing the geometry of that widget, but the layout can never act as a parent itself. Indeed, [http://doc.qt.nokia.com/latest/qwidget.html Qt::Widget]'s constructor takes a [http://doc.qt.nokia.com/latest/qwidget.html Qt::Widget] pointer for the parent, and [http://doc.qt.nokia.com/latest/qlayout.html Qt::Layout] doesn't inherit from [http://doc.qt.nokia.com/latest/qwidget.html Qt::Widget].  
Qt:ss' käyttöliittymäkomponentit ovat joko muiden käyttöliittymäkomponenttien tyttäriä (esim.: '''<tt>self</tt>'''), 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 [http://doc.qt.nokia.com/latest/qwidget.html Qt::Widget] konstruktori ottaa osoittimen [http://doc.qt.nokia.com/latest/qwidget.html Qt::Widget] emoon, ja [http://doc.qt.nokia.com/latest/qlayout.html Qt::Layout] ei peri kohteesta [http://doc.qt.nokia.com/latest/qwidget.html Qt::Widget].  


=== Running the Application ===
=== Sovelluksen suorittaminen ===


The LCD number reflects everything you do to the slider, and the widget handles resizing well. Notice that the LCD number widget changes in size when the window is resized (because it can), but the others stay about the same (because otherwise they would look strange).  
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).  


=== Exercises ===
=== Harjoitukset ===


Try changing the LCD number to add more digits or to change mode ([http://doc.qt.nokia.com/latest/qlcdnumber.html#mode-prop Qt::LCDNumber::setMode()]). You can even add four push buttons to set the number base.  
Yritä muuttaa nestekidenäyttönumeroita lisäämällä lisää numeroita tai muuttamalal tilaa ([http://doc.qt.nokia.com/latest/qlcdnumber.html#mode-prop Qt::LCDNumber::setMode()]). Voit myös lisätä neljä painiketta kantaluvun asettamiseksi.  


You can also change the slider's range.  
Voit myös vaihtaa liukukytkimen lukualuetta.  


Perhaps it would have been better to use [http://doc.qt.nokia.com/latest/qspinbox.html Qt::SpinBox] than a slider?  
Ehkä olisi parempi käyttää komponenttia [http://doc.qt.nokia.com/latest/qspinbox.html Qt::SpinBox] kuin liukukytkintä?  


Try to make the application quit when the LCD number overflows.
Yritä tehdä sovelluksesta sulkeutuva, kun nestekidenäytön numerot menevät lukualueen ylärajan ylitse.


[[Category:Ruby]]
[[Category:Ruby]]

Latest revision as of 14:18, 18 July 2012

Other languages:


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ä?

Yritä tehdä sovelluksesta sulkeutuva, kun nestekidenäytön numerot menevät lukualueen ylärajan ylitse.