Qt-Käyttöliittymäkirjasto
Total Page:16
File Type:pdf, Size:1020Kb
Qt-käyttöliittymäkirjasto Matti Lehtinen [email protected] 26.11.2007 Tiivistelmä Tässä raportissa tarkastellaan Qt-käyttöliittymäkirjastoa ja sen käyt- töä C++-kielellä. Raportissa tarkastellaan ensiksi Qt:n ominaisuuksia, mukana tulevia kirjastoja ja työkaluja, sekä kääntämistä. Qt:n käyt- töä 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ähde- koodi 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 kui- tenkin joudutaan hieman luopumaan suoritustehosta ja lisäksi käyttöjärjes- telmään yleensä joudutaan asentamaan tarvittavat virtuaalikoneet, emulaat- torit 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 kirjoittamal- la 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ärjes- telmä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 pakette- ja 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 kehit- täminen. Kaupallinen lisenssi tarjoaa lisäksi täyden tuen Trolltech:lta, sekä mahdollisuuden käyttää joitain kaupalliseen käyttöön tarkoitettuja kompo- nentteja. Seuraavaksi tulevat opetukseen ja akateemiseen tutkimukseen tar- koitetut lisenssit. Kummallakaan lisenssillä ei saa kehittää kaupallisia sovel- luksia, mutta akateeminen lisenssi sisältää muuten samoja etuja kuin kau- pallinen 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. Console- versio 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 so- velluksien tekemisen ilman erikoisuuksia. Viimeisenä tulee Qt Desktop, joka pitää sisällään kaikki mahdolliset kirjastomoduulit. Avoimen lähdekoodin li- senssin 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ä hel- pommaksi. Merkittävin yksittäinen työkalu on käyttöliittymän rakentami- seen tarkoitettu Qt Designer, jolla voi Delphin tai Visual Studion tyylisesti kasata käyttöliittymän erilaisista komponenteista [5]. Designerissa ei voi suo- raan muokata koodia, mutta se mahdollistaa signaalien yhdistämisen kom- ponenttien välille sekä Delphin tyylisten action-olioitten luomisen. Hyödyl- lisenä ominaisuutena Designerissa voi myös lisätä ns. layoutteja, jotka käy- tännössä hoitavat automaattisesti komponenttien sijoittelun työalueen koon muuttuessa. Designerista on olemassa ilmainen lisäosa Eclipseen, sekä kau- pallisessa 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 kysei- sistä 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 tarkoi- tettu Assistant [7]. Assistant sisältää web-selaimen sekä help-tiedostojen se- laamiseen tarkoitetun sovelluksen merkittävimpiä ominaisuuksia. 4 Kääntäminen Qt-sovelluksen lähdekoodit voi kääntää binääritiedostoksi millä tahansa kään- täjällä ja linkittäjällä, kunhan ne tukevat C++:aa ja käytettävää käyttöjär- jestelmää. Käännöksessä tarvittavien kuvaustiedostojen (makele) tekemi- seen 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ä ai- nut 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 tekemis- tä, 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 erilais- ta metatietoa. 5 Kirjastomoduulit Qt-koostuu kuudesta eri kirjastomoduulista [10], joita jaetaan eri tavoin myy- tävien editionien mukaan [4]. Moduuleista tärkein on Core, joka tarjoaa luok- kia kaikista olellisimpia ominaisuuksia varten, kuten tiedostojen käsittely, säikeet, tapahtumienkäsittely, merkkijonot ja tietovarastot. Graasta käyt- töliittymää varten on oma moduulinsa GUI, joka tarjoaa kaikki peruskom- ponentit 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 OpenGL- käyttöä varten. Verkkosovelluksia varten on olemassa oma moduulinsa ja se tarjoaa helpon rajapinnan TCP/UDP-protokollien käsittelyyn. Sama mo- duuli tarjoaa myös joitain ylemmän tason protokollien käsittelyä helpottavia luokkia, esim. HTTP-protokollaa varten. Viimeisimpänä on tiedon tallenta- mista sekä käsittelyä varten XML- ja tietokanta-moduulit. Nämä moduulit mahdollistavat helpon pääsyn eri SQL-palvelimille, sekä monipuolisen parse- rin XML-kieltä varten. 6 Tapahtumienkäsittely Eri sovelluskehyksissä tapahtumienkäsittelyssä käytetään usein takaisinkut- sufunktioita osoitteiden kautta. Menetelmässä funktion osoittimella ilmais- taan, mitä funktiota käytetään kunkin tapahtuman käsittelyyn. Tässä mene- telmä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öisyyt- tä ja turvallisuutta silmällä pitäen. Qt:n omaa tapahtumienkäsittelyä kut- sutaan signal-slot-mekanismiksi [11] ja se on keskeisin ominaisuus Qt:ssa. Käytännössä signaalit ovat tapahtumia ja slot-funktiot ovat tavallisia funk- tioita, jotka käsittelevät tapahtumia. Kun jokin tapahtuma halutaan käsitel- lä 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 me- kanismi 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ä tahan- sa, kunhan yhdistettävät oliot tunnetaan. Signaaleja voidaan myös ketjuttaa, eli jonkin tapahtuman voi määrätä aiheuttamaan toisen tahtuman. Yhdistel- mien 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, pri- vate 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 pa- luuarvo 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