Qt-käyttöliittymäkirjasto

Samankaltaiset tiedostot
Qt perusteet. Juha-Matti Vanhatupa. (vanhan kurssin Graafisen käyttöliittymän ohjelmointi materiaalia)

QT framework. Juha Järvensivu 2007

Graafisen käyttöliittymän ohjelmointi

Qt kaikkialla?

Graafisen käyttöliittymän ohjelmointi Syksy 2013

4. Luokan testaus ja käyttö olion kautta 4.1

15. Ohjelmoinnin tekniikkaa 15.1

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä

15. Ohjelmoinnin tekniikkaa 15.1

ELM GROUP 04. Teemu Laakso Henrik Talarmo

D-OHJELMOINTIKIELI. AA-kerho, 33. Antti Uusimäki. Arto Savolainen

Tapahtumapohjainen ohjelmointi. Juha Järvensivu 2007

Tapahtumapohjainen ohjelmointi

TIE Ohjelmistojen suunnittelu

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Loppukurssin järjestelyt C:n edistyneet piirteet

Qt-ohjelmointitekniikat Java-osaajan näkökulmasta

Olio-ohjelmointi Javalla

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo

Kieliversiointityökalu Java-ohjelmistoon. Ohje

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

.NET ajoympäristö. Juha Järvensivu 2007

Rajapinta (interface)

Ohjelmoinnin peruskurssien laaja oppimäärä

Android ohjelmointi. Mobiiliohjelmointi 2-3T5245

Tapahtumapohjainen ohjelmointi. Juha Järvensivu 2008

Pedacode Pikaopas. Java-kehitysympäristön pystyttäminen

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

Tech Conference Visual Studio 2015, C#6,.NET4.6. Heikki Raatikainen. #TechConfFI

WINE API ja Virtualisointiohjelmistot

TIE Ohjelmistojen suunnittelu. Luento 8..9: moniperintä

Visual Basic -sovelluskehitin Juha Vitikka

Ohjelmointi Linuxissa. Sisällysluettelo. 1. Mitä tarvitaan sovellusten tuottamiseen? Tehnyt: Antti Martikainen ( )

9. Periytyminen Javassa 9.1

Loppukurssin järjestelyt

9. Periytyminen Javassa 9.1

TIE Principles of Programming Languages CEYLON

ITKP102 Ohjelmointi 1 (6 op)

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Javan perusteita. Janne Käki

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Ohjelmoinnin peruskurssien laaja oppimäärä

Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python

TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli

Metodien tekeminen Javalla

C-ohjelmoinnin peruskurssi. Pasi Sarolahti

Uutta Remote Support Platform 3.0 -versiossa

Graafisen käyttöliittymän ohjelmointi Syksy 2013

Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki

Jypelin käyttöohjeet» Miten voin liittää törmäyksiin tapahtumia?

Common Language Runtime

Qt pohjaisen paikkatietotyökalun suunnittelu ja toteutus

JAVA-OHJELMOINTI 3 op A274615

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Järjestelmäarkkitehtuuri (TK081702)

4. Lausekielinen ohjelmointi 4.1

Ikkunointijärjestelmät

1. Omat operaatiot 1.1

Dart. Ryhmä 38. Ville Tahvanainen. Juha Häkli

Web Services tietokantaohjelmoinnin perusteet

Ohjelmointi 1. Kumppanit

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen

1. Olio-ohjelmointi 1.1

Pakkauksen kokoaminen

P e d a c o d e ohjelmointikoulutus verkossa

JReleaser Yksikkötestaus ja JUnit. Mikko Mäkelä

Jypelin käyttöohjeet» Ruutukentän luominen

Käyttöliittymän lokalisointi. Juha Järvensivu 2008

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

Qt Quick-kehitys Maemo-alustalle

Taulukot. Jukka Harju, Jukka Juslin

Apuja ohjelmointiin» Yleisiä virheitä


Delegaatit ja tapahtumakäsittelijät

DXL Library ja DXL-kielen olemus. Pekka Mäkinen SoftQA Oy http/

AS C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin

Osoitin ja viittaus C++:ssa

8. Näppäimistöltä lukeminen 8.1

Harjoituksen aiheena on tietokantapalvelimen asentaminen ja testaaminen. Asennetaan MySQL-tietokanta. Hieman linkkejä:

Microsoft Visual Studio 2005

Johdatus ohjelmointiin

C++11 Syntaksi. Jari-Pekka Voutilainen Jari-Pekka Voutilainen: C++11 Syntaksi

Copyright Observis Oy All rights reserved. Observis Oy Ville Kanerva, CTO Heikki Isotalus, COO Datasta tietoa

Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 1

Osio 4: Tietovirrat. Properties- eli ominaisuustiedostot Logger: lokitietojen käsittely

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat

JavaRMI 1 JAVA RMI. Rinnakkaisohjelmoinnin projekti 1 osa C Tekijät: Taru Itäpelto-Hu Jaakko Nissi Mikko Ikävalko

Mikä yhteyssuhde on?

Tietokantasovellus (4 op) - Web-sovellukset ja niiden toteutus

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

17. Javan omat luokat 17.1

Javan asennus ja ohjeita ongelmatilanteisiin

Soveltuvuustutkimus Lifebelt-ohjelman ideologian käytettävyydestä olioorientoituneeseen

Transkriptio:

Qt-käyttöliittymäkirjasto Matti Lehtinen makaleht@cc.jyu.fi 26.11.2007 Tiivistelmä Tässä raportissa tarkastellaan Qt-käyttöliittymäkirjastoa ja sen käyttöä C++-kielellä. Raportissa tarkastellaan ensiksi Qt:n ominaisuuksia, mukana tulevia kirjastoja ja työkaluja, sekä kääntämistä. Qt:n käyttöä tarkastellaan Qt:n tapahtumienkäsittelymekanismin kautta pienen esimerkkikoodin avulla. 1 Johdanto Graasten sovellusten tekeminen useammille käyttöjärjestelmille on usein vaikeaa, sillä kielestä riippuen pahimmassa tapauksessa sovelluksen lähdekoodi joudutaan osittain kirjoittamaan uudestaan vastaamaan kohdekäyttöjärjestelmien rajapintoja. Toinen helpompi ratkaisu on käyttää kieliä, joita voidaan emuloida tai ajaa prosessikohtaisessa virtuaalikoneessa. Tällöin kuitenkin joudutaan hieman luopumaan suoritustehosta ja lisäksi käyttöjärjestelmään yleensä joudutaan asentamaan tarvittavat virtuaalikoneet, emulaattorit tai muut sovellukseen ajoon tarvittavat työkalut. Trolltech yritys tuo oman ratkaisun cross-platform-sovellusten kehittämisongelmaan Qt-käyttöliittymäkirjaston muodossa. Qt:lla voi helposti tehdä tehokkaita natiiveja sovelluksia useammille käyttöjärjestelmille kirjoittamalla vain yhden yhteisen lähdekoodin [1]. Sovellusten kirjoittaminen on helppoa intuitiivisen ja monipuolisen rajapinnan avulla. Lisäksi Qt:n yksinkertainen signal-slot-mekanismi tekee tapahtumienkäsittelyn turvalliseksi ja helpoksi. 2 Qt yleisesti Qt on norjalaisen Trolltech-yrityksen kehittämä useammalla käyttöjärjestelmällä toimiva graanen käyttöliittymäkirjasto. Qt kehitettiin alunperin 1

C++-kielelle, mutta myöhemmin Trolltech on tarjonnut sitä Java-kielelle oman Qt Jambi-kirjaston myötä. Qt:sta on myös tullut epävirallisia paketteja muille kielille, johin kuuluvat mm. Python, Ruby, PHP, Pascal, C#, Perl ja Ada [2]. Qt tukee tällä hetkellä Mac, Linux ja Windows käyttöjärjestelmiä sekä niiden eri versioita [1]. Qt:n lisenssejä on tällä hetkellä olemassa neljä erilaista [3]. Ensimmäisenä on kaupallinen lisenssi, jolla mahdollistetaan kaupallisten sovellusten kehittäminen. Kaupallinen lisenssi tarjoaa lisäksi täyden tuen Trolltech:lta, sekä mahdollisuuden käyttää joitain kaupalliseen käyttöön tarkoitettuja komponentteja. Seuraavaksi tulevat opetukseen ja akateemiseen tutkimukseen tarkoitetut lisenssit. Kummallakaan lisenssillä ei saa kehittää kaupallisia sovelluksia, mutta akateeminen lisenssi sisältää muuten samoja etuja kuin kaupallinen lisenssi. Opetukseen tarkoitettu lisenssi on kouluille, yliopistoille, yms. ilmainen, kun taas akateeminen lisenssi on maksullinen, mutta sen saa hankittua alennettuun hintaan. Viimeisenä on avoimen lähdekoodin lisenssi, jolla voi tehdä GPL:n mukaisia sovelluksia. Trolltech myy kauppallisen lisenssin alla eri versioita [4], joiden käyttötarkoitus määrittelee mukana tulevat kirjastomoduulit. Versioita on kolme, joista moduulien lukumäärässä katsottuna suppein on Qt Console. Consoleversio on tarkoitettu palvelinsovelluksiin, joissa graasta käyttöliittymää ei tarvita, mutta tietoliikenne- ja tietokantamoduulit ovat tärkeitä. Seuraavana tulee Qt Desktop Light, joka käytännössä mahdollistaa vain graasien sovelluksien tekemisen ilman erikoisuuksia. Viimeisenä tulee Qt Desktop, joka pitää sisällään kaikki mahdolliset kirjastomoduulit. Avoimen lähdekoodin lisenssin alla ladattava Qt-paketti sisältää kaikki kirjastomoduulit, joten sillä voi tehdä monipuolisia avoimia sovelluksia. 3 Työkalut Qt:n mukana tulee työkaluja, joilla voidaan sovellusten tekeminen tehdä helpommaksi. Merkittävin yksittäinen työkalu on käyttöliittymän rakentamiseen tarkoitettu Qt Designer, jolla voi Delphin tai Visual Studion tyylisesti kasata käyttöliittymän erilaisista komponenteista [5]. Designerissa ei voi suoraan muokata koodia, mutta se mahdollistaa signaalien yhdistämisen komponenttien välille sekä Delphin tyylisten action-olioitten luomisen. Hyödyllisenä ominaisuutena Designerissa voi myös lisätä ns. layoutteja, jotka käytännössä hoitavat automaattisesti komponenttien sijoittelun työalueen koon muuttuessa. Designerista on olemassa ilmainen lisäosa Eclipseen, sekä kaupallisessa versiossa lisäosa Microsoft Visual Studioon. Kielien käännöksien helpottamiseksi Qt tarjoaa Linquist-sovelluksen, jol- 2

la voidaan helposti tehdä käännöstiedostoja koskematta itse lähdekoodiin [6]. Linquist analysoi ensin lähdekoodin ja poimii sieltä kaikki merkkijonot, joita tullaan kääntämään. Tämän jälkeen käyttäjä pääsee helposti tekemään kyseisistä merkkijonoista käännökset tarvittaville kielille. Käännetyt merkkijonot lisätään lopuksi takaisin sovelluksen yhteyteen käännösvaiheessa. Qt sisältää lisäksi monia muita pieniä työkaluja lähdekoodien kanssa. Näistä sovelluksista käytännöllisin on dokumentaation selaamiseen tarkoitettu Assistant [7]. Assistant sisältää web-selaimen sekä help-tiedostojen selaamiseen tarkoitetun sovelluksen merkittävimpiä ominaisuuksia. 4 Kääntäminen Qt-sovelluksen lähdekoodit voi kääntää binääritiedostoksi millä tahansa kääntäjällä ja linkittäjällä, kunhan ne tukevat C++:aa ja käytettävää käyttöjärjestelmää. Käännöksessä tarvittavien kuvaustiedostojen (makele) tekemiseen on Qt:ssa tarjolla qmake-sovellus [8], joka osaa yhden projektitiedoston perusteella määrätä tarvittavat kääntäjien parametrit, kirjastojen polut ja muut attribuutit käännettävän ympäristön mukaisesti. Qmake on yleensä ainut sovellus, joka täytyy ajaa kääntäjien lisäksi, sillä qmake osaa tarvittaessa kutsua käyttöliittymätiedostojen kääntäjää uic:ia (User Interface Compiler) tai metatietojen kääntäjää moc:ia (Meta Object Compiler). Metatietojen kääntäjä (moc) [9] on oleellinen osa Qt-sovelluksen tekemistä, sillä moc:lla generoidaan väliaikainen kääntäjälle kelpaava C++ koodi. Normaalisti Qt-sovelluksen C++-koodi sisältää erilaisia makroja ja funtiota, joita koodaajan on helppo tulkita. Tällaisenaan koodia ei voi vielä kääntää ja siksi moc:lla generoidaan väliaikaista kääntyvää koodia, joka sovitetaan Qt:n sisäisiin mekanismeihin. Käytännössä väliaikanen koodi pitää sisällään mm. ajonaikaista tyyppitietoa, sekä signal-slot-mekanismin tarpeisiin erilaista metatietoa. 5 Kirjastomoduulit Qt-koostuu kuudesta eri kirjastomoduulista [10], joita jaetaan eri tavoin myytävien editionien mukaan [4]. Moduuleista tärkein on Core, joka tarjoaa luokkia kaikista olellisimpia ominaisuuksia varten, kuten tiedostojen käsittely, säikeet, tapahtumienkäsittely, merkkijonot ja tietovarastot. Graasta käyttöliittymää varten on oma moduulinsa GUI, joka tarjoaa kaikki peruskomponentit graasissa sovelluksissa. Tämä moduuli mahdollistaa myös omien komponenttien tekemisen. GUI-moduulin lisäksi on olemassa Qt OpenGL 3

3D Visualization-moduuli, joka nimensä mukaisesti tarjoaa luokat OpenGLkäyttöä varten. Verkkosovelluksia varten on olemassa oma moduulinsa ja se tarjoaa helpon rajapinnan TCP/UDP-protokollien käsittelyyn. Sama moduuli tarjoaa myös joitain ylemmän tason protokollien käsittelyä helpottavia luokkia, esim. HTTP-protokollaa varten. Viimeisimpänä on tiedon tallentamista sekä käsittelyä varten XML- ja tietokanta-moduulit. Nämä moduulit mahdollistavat helpon pääsyn eri SQL-palvelimille, sekä monipuolisen parserin XML-kieltä varten. 6 Tapahtumienkäsittely Eri sovelluskehyksissä tapahtumienkäsittelyssä käytetään usein takaisinkutsufunktioita osoitteiden kautta. Menetelmässä funktion osoittimella ilmaistaan, mitä funktiota käytetään kunkin tapahtuman käsittelyyn. Tässä menetelmässä on monia huonoja puolia. Ensinnäkin ne eivät ole tyyppisuojattuja ja toiseksi funktiot ovat hyvin riippuvaisia toisistaan, sillä kutsujan täytyy tarkalleen tietää, mitä funktiota kutsua. Qt:ssa tapahtumienkäsittelyä on lähestytty erityisesti helppokäyttöisyyttä ja turvallisuutta silmällä pitäen. Qt:n omaa tapahtumienkäsittelyä kutsutaan signal-slot-mekanismiksi [11] ja se on keskeisin ominaisuus Qt:ssa. Käytännössä signaalit ovat tapahtumia ja slot-funktiot ovat tavallisia funktioita, jotka käsittelevät tapahtumia. Kun jokin tapahtuma halutaan käsitellä tietyllä funktiolla, niin tällöin käytetään connect-funktiota yhdistämään tapahtuma (signal) haluttuun käsittelijäfunktioon (slot). Qt:n sisäinen mekanismi hoitaa automaattisesti yhdistämisen ja tarkistaa, että yhdistettävät signaalit ja slotit ovat tyypeiltään sopivia. Yhdistelmiä tehtäessä olioiden ei tarvitse olla tietoisia toisistaan, eli yhdistelmät voidaan tehdä missä tahansa, kunhan yhdistettävät oliot tunnetaan. Signaaleja voidaan myös ketjuttaa, eli jonkin tapahtuman voi määrätä aiheuttamaan toisen tahtuman. Yhdistelmien lukumäärää ei myöskään ole rajoitettu mitenkään. Lisäksi yhdistelmiä voidaan jälkikäteen purkaa tai tapahtumien käsittelyn voi väliaikaisesti estää kokonaan. Qt:n käyttöliittymäluokat sisältävät laajan määrän eri signaaleja sekä slotteja, mutta myös omia vastaavia voi kirjoittaa. Luokan määrittelyssä on omat määreet signaalien ja slottien erottamiseksi. Signal- ja slot-määreitä käytetään vastaavaan tapaan, kuten näkyvyysalueen määreitä (public, private tai protected). Slot-määreen edessä käytetään lisäksi näkyvyysalueen määrettä, jolloin sisäisien tapahtumien käsittely on mahdollista. Signaalit sekä slotit kirjoitetaan aivan kuten mitkä tahansa muut funktiot, mutta paluuarvo täytyy olla aina void, sillä tapahtumat ja käsittelijät eivät palau- 4

ta mitään arvoja. Käsittelijäfunktiot täytyy luonnollisesti implementoida ja niihin ei tarvitse muulloin koskea kuin yhdistelmiä tehtäessä. Signaaleja on kuitenkin tarvetta välillä aktivoida manuaalisesti ja tällöin koodissa käytetään emit-makroa, jolla aiheutetaan tapahtuman aktivoituminen. Qt:n mekanismi osaa hoitaa automaattisesti yhdistettyjen slottien kutsun. Säikeitä käytettäessä signaalien yhdistäminen täytyy tehdä viivästetysti ja tätä varten connect-funktiossa on parametri yhdistelmän kutsumistavan määrittämiseksi. Qt:n tapahtumankäsittelijät ovat siitä erikoisia, että ne periytyvät luokasta toiseen ja niitä voidaan tarvittaessa ylikirjoittaa. Alla on yksinkertainen esimerkki Qt-sovelluksesta. Sovelluksen ikkuna sisältää painikkeen, jota painaessa sovellus sulkeutuu. Sovellus pitää sisällään myös ajastimen, joka nollautuessa myös sulkee sovelluksen. Ajastimen aika näytetään painonapin tekstissä. /*** hellowindow.h ***/ #include <qpushbutton.h> #include <qtimer.h> class HelloWindow : public QPushButton { Q_OBJECT private: QTimer *timer; unsigned int timeleft; public: HelloWindow() { timeleft = 10; timer = new QTimer(this); this->connect(timer, SIGNAL(timeout()), this, SLOT(updateTime())); this->connect(this, SIGNAL(clicked()), this, SIGNAL(helloQuits())); setwindowtitle(tr("hello World!")); resize(200, 60); updatetime(); timer->setinterval(1000); timer->start(); } private slots: void updatetime() { if (!(--timeleft)) emit helloquits(); this->settext(tr("quit") + "..." + QString::number(timeLeft)); } signals: void helloquits(); }; /*** main.cpp ***/ #include <qapplication.h> 5

#include "hellowindow.h" int main(int argc, char **argv) { QApplication app(argc, argv); HelloWindow hello; QObject::connect(&hello, SIGNAL(helloQuits()), &app, SLOT(quit())); hello.show(); return app.exec(); } 7 Yhteenveto Qt-käyttöliittymäkirjasto on erinomainen tapa kirjoittaa sovelluksia useammalle eri käyttöjärjestelmälle. Qt:n luokat tarjoavat helppokäyttöisen ja kattavan rajapinnan eri toimintoihin ja ominaisuuksiin, lisäten tuotettavuutta sovelluksen kehityksessä. Signal-slot-mekanismi taas tuo helpon ja turvallisen tavan käsitellä tapahtumia. C++:n joustavuuden, nopeuden ja tehokkaitten ominaisuuksien lisäksi Qt tarjoaa parannuksia C++-ohjelmointiin mm. varmistetuilla osoittimilla (QPointer-luokka) ja parannetulla dynaamisella tyyppimuunnoksella [12]. Heikkouksiakin Qt:sta löytyy, sillä Qt:ta on kritisoitu C++:n poikkeustenkäsittelyn epäyhteensopivuudesta Qt:n sisäisten mekanismien kanssa. Toisaalta Qt:n omien luokkien kanssa poikkeukset on kierretty paluuarvoilla, mutta tämä ei kuitenkaan korvaa oikeata poikkeustenkäsittelyä. Signal-slotmekanismia on myös joissain tapauksissa sanottu hitaaksi, sillä tapahtumat eivät ole suoria takaisinkutsuja, vaan ne joudutaan kierrättämään Qt:n omien mekanismien kautta. Tämä ongelma on kuitenkin aika marginaalinen, sillä tapahtumien käsittely käyttöliittymässä ei tavitse olla aivan reaaliaikaista ja muutenkin Qt:n oma mekanismi on vain muutamia kertoja hitaampi kuin suora takaisinkutsu. Qt onkin tällä hetkellä yksi merkittävimmistä tavoista tehdä natiiveja sovelluksia eri käyttöjärjestelmille. Tästä mm. kertoo laaja kirjo tunnettuja sovelluksia, kuten Google Earth, Opera, Last.fm Player, Adobe Photoshop Album, Doxygen ja Skype [2]. Lähteet [1] Trolltech, Harness Cross-Platform Eciency Trolltech, saatavilla WWW-muodossa <URL: 6

http://trolltech.com/products/qt/features/crossplatform-efficiency>, viitattu 20.11.2007. [2] Wikipedia, Qt (toolkit), saatavilla WWW-muodossa <URL: http://en.wikipedia.org/wiki/qt_(toolkit)>, viitattu 20.11.2007. [3] Trolltech, Qt Licensing Overview Trolltech, saatavilla WWW-muodossa <URL: http://trolltech.com/products/qt/licenses/licensing>, viitattu 20.11.2007. [4] Trolltech, Qt Editions Comparison Chart Trolltech, saatavilla WWW-muodossa <URL: http://trolltech.com/products/qt/licenses/pricing/editions>, viitattu 23.11.2007. [5] Trolltech, Qt Designer Trolltech, saatavilla WWW-muodossa <URL: http://trolltech.com/products/qt/features/designer>, viitattu [6] Trolltech, Qt 4.3: Qt Linguist Manual, saatavilla WWW-muodossa <URL: http://doc.trolltech.com/4.3/linguist-manual.html>, viitattu [7] Trolltech, Qt Assistant Trolltech, saatavilla WWW-muodossa <URL: http://trolltech.com/products/qt/features/assistant>, viitattu [8] Trolltech, Qt 4.3: qmake Manual, saatavilla WWW-muodossa <URL: http://doc.trolltech.com/4.3/qmake-manual.html>, viitattu [9] Trolltech, Qt 4.3: Using the Meta-Object Compiler (moc), saatavilla WWW-muodossa <URL: http://doc.trolltech.com/4.3/moc.html>, viitattu [10] Trolltech, Qt Class Library Modules Trolltech, saatavilla WWW-muodossa <URL: http://trolltech.com/products/qt/indepth/modules>, viitattu 23.11.2007. [11] Trolltech, Qt 4.3: Signals and Slots, saatavilla WWW-muodossa <URL: http://doc.trolltech.com/4.3/signalsandslots.html>, viitattu 25.11.2007. [12] Trolltech, Qt In Depth Trolltech, saatavilla WWW-muodossa <URL: http://trolltech.com/products/qt/indepth/indepth>, viitattu 25.11.2007. 7