Qt perusteet Juha-Matti Vanhatupa (vanhan kurssin Graafisen käyttöliittymän ohjelmointi materiaalia)
Sisältö Käännösprosessi MetaObjectSystem Hyödyt Qt:n moduulit Qt käyttöliittymän muistinhallinta Debug-tulosteet ja QPointer
Qt Sovellukset ajetaan natiivisti (ei tulkata) - Tehokasta QT kapseloi käyttöjärjestelmäkohtaisia apeja - Tiedostojen käsittely - Verkko-ominaisuudet - Prosessit - Säikeet - Tietokanta yhteydet - jne.
Käännösprosessi Käännökseen tarvittavat tiedostot luodaan qmake ohjelmalla projektitiedoston (.pro) tietojen perusteella Käyttöliittymätiedostot (.ui) käännetään uic -kääntäjällä (User Interface Compiler) ja metatiedot moc kääntäjällä (Meta Object Compiler) Metakääntäjä generoi väliaikaista c++ kääntäjälle kelpaavaa koodia.
Käännösprosessi
Käännösprosessi Esimerkit käännöksestä - Qt Creatorista - Komentoriviltä
Komentorivikäännös Hakemistossa aluksi: main.cpp, mainwindow.cpp, mainwindow.h ja mainwindow.ui qmake -project // projektitiedoston luominen // Qt 5:ssa lisää itse.pro tiedostoon QT += widgets // jos rivi ei synny automaattisesti qmake // makefilen luonti make // käännös, esimerkissä komento on mingw32-make, koska käytetään MinGW-kääntäjää. Tämän jälkeen ohjelman exe voidaan ajaa. Käytettyjen työkalujen täytyy löytyä Pathympäristömuuttujasta.
MetaObjectSystem C++:n laajennus, jonka tarkoitus tehdä kielestä paremmin sopiva käyttöliittymäohjelmointiin. Mekanismi, jonka avulla toisiaan tuntemattomat oliot voivat kommunikoida. (tärkein hyöty, mutta myös muita on ) Mukana Qt:ssa alusta asti.
MetaObjectSystem Hyötyjä Signal ja slot mekanismi Dynamic properties qobject_cast operaatio Lisäksi (QObject) -oliolta voi kysyä tietoja
MetaObjectSystem Järjestelmä perustuu QObject-luokka Q_OBJECT-makro moc kääntäjä (Meta object compiler)
MetaObjectSystem-esimerkki class example_class : public QObject { Q_OBJECT }; public: signals: void some_signal(int index); public slots: void clicked();
Signal-slot -mekanismi Yhdistämislauseen syntaksi muotoa: connect(sender, SIGNAL(signal), receiver, SLOT(slot)); sender ja receiver QObject osoittimia signal ja slot funktioiden prototyyppejä ilman parametrien nimiä (function signatures) Signaalin ja slot:in parametrien tulee olla samat. Jos signaalilla enemmän parametreja kuin slot:lla niitä ei käytetä.
Signal-slot -mekanismi Yksi signaali voidaan yhdistää moneen slot:iin. Tällöin slot:ien kutsuntajärjestys on määrittelemätön. Monta signaalia voidaan yhdistää samaan slot:iin. Mikä vain niistä laukaisee slot:n. Signaali voidaan yhdistää toiseen signaaliin. Yhteydet voidaan myös purkaa disconnectfunktiolla.
Signal-slot -mekanismi Signaaleita ja slotteja voidaan käyttää myös muissa kuin käyttöliittymän luokissa (kunhan periytyvät QObject:sta ja Q_OBJECT-makro on lisätty luokan toteutukseen). Signaaleita voidaan kytkeä eri tavoin antamalla kytkentätapa connect:n parametrinä. Kytkentätavoista rinnakkaisuusluennolla. Qt 5 tarjoaa uuden syntaksin signaalien kytkemiseen käyttäen osoittimia: QObject::connect(sender, &Sender::valueChanged, receiver, &Receiver::updateValue);
Dynamic cast Toimii kuin C++:n dynamic_cast operaatio - ei tarvitse C++:n RTTI (run-time type information) tukea kuten dynamic_cast. - toimii kaikille QObject:sta perityille luokille. QObject *obj = new MyWidget(); QWidget *widget = qobject_cast<qwidget*>(obj);
Dynamic properties Propertyjä voidaan asettaa ja lukea käyttäen QObject:n geneerisiä setproperty() ja property() funktioita. Funktioita käyttäen ei tarvitse tietää olion aliluokkaa. MetaObjectSystem mahdollistaa propertyjen lisäämisen myös ohjelman ajon aikana (dynamic properties).
Qt Luokkakirjaston moduulit Oletuksena projektiin mukaan liitetään moduuleista QtCore ja QtGui Muut lisättävä projektitiedostoon erikseen QT += moduuli esim. QT += network
Qt Luokkakirjaston moduulit Core Module GUI Module Network Module Qt Script QtSQL QtXML QtWebKit Jne. http://qt-project.org/doc/qt-5.1/qtdoc/qtmodules.html
QT Core Module QT Object Model QT event processing model QT container classes Threading Process Handling File I/O QThread QString QVector QMetaType QSettings QObject QPoint
QT GUI Module Käyttöliittymäkirjasto Fontit Tyylit (Styles) QWidget QButton QPen QClipboard QDialog QImage QResizeEvent
Qt käyttöliittymän muistinhallinta Kun QObject:i luodaan se lisätään parentolion lapseksi. Kun parent-olio tuhotaan (delete), se tuhoaa lapsiolionsa, jotka vastaavasti tuhoavat omat lapsiolionsa. Näin pääikkunan sulkeminen vapauttaa kaiken käyttöliittymälle varatun muistin.
Parent suhteet esimerkki Rakentaja: QWidget(QWidget* pparent = 0); QWindow* pwindow = new QWindow(); QPushButton pbutton = new QPushButton(pWindow);
QPointer Turvallinen osoitin Osoitin nollataan automaattisesti kun osoitettu objekti tuhotaan. Käytetään kuin normaalia osoitinta. Osoitettu objekti tulee olla periytetty QObject-luokasta ja määritelty Q_OBJECT makrolla. QPointer<QLabel> plabel = new QLabel(); QPointer<QLabel> plabel2 = plabel; plabel->settext( otsikko ); delete plabel; // myös plabel2 nollautuu.
Debug-tulosteet qdebug() qdebug() << Tämä on debug tuloste ; Objektin tilan tulostaminen QObject obj; obj.dumpobjectinfo(); obj.dumpobjecttree();