You are on page 1of 8

Qtye Giri s

Can Kavaklolu g 19 Temmuz 2007

o Onsz

Bu yaz Can Kavaklolu[1] tarafndan, Cerberus[2] takmnn ihtiyalar dorultusunda yazlmtr. g c g s Dou Kayaya elzem yardmlarndan iin teekkrler. g c s u Yazdaki hatalar, nerileri, sorular ve/veya yaznn oluturduu tepkileri eposta@cankavaklioglu.name.tr o s g adresine yollarsanz pek de gzel olur. u Herzamanki gibi bu yazda yazanlar etkisinde kalarak yaptnz hareketlerden yazar sorumlu g deildir. g srm 1.2 - Temmuz 2006 uu

Gereksinimler

Trolltechin Qt 4.0 alt yapsn kullanarak programlama yapmak iin gerekli ktphaneleri yklec uu u mek iin: c Debian sisteminde qt4-dev-tools paketini yklemeniz yeterli olacaktr. u Dier birka sistemin paketi de mevcuttur[13]. g c Herhangi bir Linux sisteminde indireceiniz .tar.gz dosyas ile kurulumu gerekletirebilirsiniz. g c s Dier sistemler iin kurlum ve dier konularda detayl anlatm iin [10]. g c g c

Hello World

Programla ilgili her konuda olduu gibi ilk nce ekrana Hello World yazdran program ile ie g o s balayalm: s Bu kodu gcc helloworld.cpp komutu ile altrdnzda yle bir hata kmesi ile karlayorsanz: c s g so u s s helloworld.cpp:1:28: QApplication: No such file or directory helloworld.cpp:2:27: QPushButton: No such file or directory gcc program ktphanelerinizi bulamyor demektir. uu Daha dorusu qmake kullanarak, dzgn bir Makele olutumanz gerekiyor demektir. qmake g u u s in de doru srmn kullandmza dikkat etmemiz gereklidir. Bunu anlamann en iyi yolu g uu u u g aadaki komutlarn ktsndaki ilk satrlara bakarak, hangi Qt srm kullanldn yazan s g c uu u g satra gz atmaktr. o Benim sistemimde bu komut yle alyor: so c s 1

/**************************************************************** ** ** Qt tutorial 1 ** ****************************************************************/ #include <QApplication> #include <QPushButton> int main(int argc, char *argv[]) { QApplication app(argc, argv); QPushButton hello("Hello world!"); hello.resize(100, 30); hello.show(); return app.exec(); } Sekil 1: Ornek: Hello World[11] qmake -project -nopwd helloworld.cpp

Komutu bir adet klasrad.pro dosyas oluturuyor. Bu dosyann ierisinde qmake in Mao s c kele n oluturaca projeyi temsil ediyor. s g Eer bulunduumuz klasrdeki btn .cpp ler projeye katlsn istiyorsak, o zaman son iki g g o uu parametreyi vermeden de komutumuzu arabiliriz: c g qmake -project .pro dosyamz oluturduktan sonra gerekli Makele oluturmas iin s s c qmake komutunu aryoruz ve Makele mz olutuyor. Burada dikkat edilecek nokta (en azndan c g s benim sistemimde yle idi) qmake komutu Qt 3.0 srmnn qmake ini kullanyordu. Bu da o uu u u yanl Makele olumasna sebep oluyordu. O yzden oluan Makele n ilk satrlarn kontrol s s u s ederek orada Qt 4... ifadesinin getiine emin olmak gereklidir. Benim sistemimde bunu yapac g bilmek iin qmake yerin u komutu kullanmam gerekti: c s qmake-qt4 Dzgn bir Makele olutu ise, Makele n bulunduu klasrde, u u s g o make komutu ile ilk Qt programmz oluturduk demektir. Caltrmak iin komut satrndan s s c ./<klasrad> o komutu ile program altrabiliriz. c s

Sinyaller ve Yuvalar (Signals and Slots)

Qtnin objeler aras iletiim iin kulland yaplar Sinyaller ve Yuvalar[8] olarak adlandrlrlar. s c g Throlltechin dediine gre eski sistemlerde kullanlan birbirine pointer gnderip, callback g o o yaptrmak, hem type-safe olmad, hem de strongly coupled olduu iin sakncal oluyormu. g g c s Bu yzden bu yeni sistemlerini oluturmular. u s s Binevi Sonynin OPEN-R sistemindeki gibi Subject(Signal) ve Observer(Slot) lar mevcut. Bir sinyal iki yuvaya balanabiliyor. Yukariki iki probleme verilen cevap ise yle: g so Balantlar tek elden bir fonksiyon imzas (function signature) ile belirtildii iin tip g g c c s akma problemleri yaanmyor. Hatta bu ak ayrm sayesinde derleyici bize olas has c talar gsterebiliyor. o Loosely coupled yap sayesinde, sinyali yayan objeler, yuva sahibi objelerle kurduklar balantlarda direk iliki kurmadklar iin, strongly coupled sistemlerdeki sinyal yayan g s c objelerin, btn yuva sahibi objelerden haber olma zorunluluu yoktur. uu g Sinyal ve yuvalarn birka zellikleri: co Sinyaller ve yuvalar, balantlarndan haberdar deillerdir. g g Bir yuvaya gerektii kadar sayda sinyal balanabilir. g g Bir sinyale gerektii sayda yuvaya balanabilir. g g Sinyaller sinyallere de balanabilir, bu durum, birinci sinyal olutuunda, ikinci sinyali g s g tetikleyecektir. Bir sinyal olutuunda, kodun almas sinyali oluturan satrn altna, ancak sinyalin s g c s s yuvasndan geri dn olduunda devam eder. Eer bu durum yerine, yuvadaki ilemin ayr o us g g s bir sre olarak devam etmesi isteniyorsa, sral balant (queued connections) yntemi u c g o kullanlr. Yuvalarn eriim haklar, hangi sinyallerin bu yuvaya balanabileceini belirtir. s g g

4.1

Sinyal ve Yuvalar Ornei g

2. ekildeki rnekte Counter (saya) snf, bir yuva ile tuttuu sayy deitirir. Oluturduu bir s o c g gs s g sinyal ile de, kendisini izleyenlere, saklad deerin deitiini haber verir. g g gs g #include <QObject> class Counter : public QObject { Q_OBJECT public: Counter() { m_value = 0; } int value() const { return m_value; } public slots: void setValue(int value); signals: void valueChanged(int newValue); private: int m_value; }; Sekil 2: Ornek: Sinyaller ve yuvalar[8]

Saklanan deimesi sinyalinin uretilmesinin en uygun noktas ise setValue fonksiyonu olags caktr: void Counter::setValue(int value) { if (value != m_value) { m_value = value; emit valueChanged(value); } } Sekil 3: Ornek: Sinyaller ve yuvalar: setValue fonksiyonu [8]

Dikkat edilecek satr emit valueChanged(value); satrdr. Bu komut ile, signals: ifadesi ile belirttiimiz blmdeki void valueChanged(int newValue); fonksiyon arlarak oluturulan sinyal g ou c g s yaylr. Daha ak bir rnek iin 4. ekile baknz: c o c s

Counter a, b; QObject::connect(&a, SIGNAL(valueChanged(int)), &b, SLOT(setValue(int))); a.setValue(12); b.setValue(48); // a.value() == 12, b.value() == 12 // a.value() == 12, b.value() == 48

Sekil 4: Ornek: Sinyaller ve yuvalar: bir sinyali yuvaya balamak [8] g

Bu rnekte gsterilen ilemler unlardr: o o s s 1. Iki tane Counter objesi, a ve b oluturulur. s 2. a ve b objeleri birbirlerine balanrlar. Balama komutundaki deitirge sralamas yledir: g g gs so sinyali oluturan obje, sinyal, sinyali alan obje, yuva. Bu ekilde sinyal ve yuva tanmlarken, s s SIGNAL ve SLOT makrolar kullanlmak zorundadr. 3. a.setValue(12); komutu a objesinin saklad deeri 12 ye eitler, ve hemen ardndan, g g s valueChanged(int) sinyali oluturmasn salar. Bu sinyal b objesinin setValue(int) yuvasna s g ular ve b objesinin saklad deer de 12 ye eitlenir. s g g s 4. b.setValue(48); ise sadece b objesinin deerini deitirebilir, unk a objesinin yuvas hibir g gs c u c sinyale balanmad iin, b objesinin setValue(int) fonksiyonu tarafndan oluturulan sing g c s yal a objesine ulamaz. s

Meta-Obje Sistemi
QObject::metaObject() ilgili snfn meta objesini verir. QMetaObject::className() RTTI desteine gerek duymadan alan snfn adn obje g c s c s alrken verir. QObject::inherits() istenen snfn ilgili snf tarafndan kullanlp (inherit) kullanlmadn g belirtir. QObject::tr() ve QObject::trUtf8() karakter dizilerini istenen dile evirir. c QObject::setProperty() ve QObject::property() dinamik olarak obje zelliklerinin deitirir o gs ve verir. Meta-Obje Sistemi ayn zamanda dynamic cast() ilemi iin de kullanlabilir. s c

Qtnin Meta-Obje Sistemi[15], bata sinyal ve yuvalar sistemi olmak uzere birka ilev sunar: s c s

Ozellikler Sistemi

Qtnin Ozellikler Sistemi (Property System [14] ) bir snfn ierisindeki standart veri yaplarna c denk gelir. Ancak aada belirtilen birka nemli ilev salar: s g co s g Okuma fonksiyonu her zaman mevcuttur. Istenirse yazma fonksiyonu her zaman mevcut olabilir. Kaytl (stored) znitelii, zelliin kaydedilip edilmediini belirtir. o g o g g 5

Ender olsa da yeniden balatma (reset) fonkiyonu. s Tasarlanabilir (designable) znitelii, ilgili zelliin, Qt Designer gibi bir tasarlama progo g o g ramnda gsterilip, gsterilmeyeceini belirtir. o o g Q PROPERTY() makrosu kullanlarak tanmlanr. Bu makro ancak QObjecti kullanan (inherit) snarda kullanlabilir.

6.1

Ozellik Okumak ve Yazmak

QPushButton *button = new QPushButton; QObject *object = button; // button and object point to the same object button->setDown(true); object->setProperty("down", true); Sekil 5: Ornek: Ozellik okuma yazma rnei[14] o g

button->setDown(true) yntemi derleyicinin, derleme srasnda hatalar raporlayabilmesini salar. o g button->setPropety("down",true); yntemi ise derleme srasnda kullanlabilir olmayan zellikleri programn almas srasnda o o c s eriebilmemizi salar. s g Ozellikler Sisteminin dier belirtilen dier iki fonksiyonu ise unlar: g g s QMetaObject::propertyCount() bir objenin kullanlabilecek btn zelliklerini verir. uu o QMetaObject::property() istenen objenin istenen zelliini bir QMetaProperty objesi olao g rak verir.

6.2

Ozellikler Sistemi Ornei g


class MyClass : public QObject { Q_OBJECT Q_PROPERTY(Priority priority READ priority WRITE setPriority) Q_ENUMS(Priority) public: MyClass(QObject *parent = 0); ~MyClass(); enum Priority { High, Low, VeryHigh, VeryLow }; void setPriority(Priority priority); Priority priority() const; }; Sekil 6: Ornek: Ozellik okuma yazma rnei[14] o g

Bu tanmlamay kullanmak iin yle bir ifade deneyebiliriz: c so obj->setProperty("priority", "VeryHigh"); Q PROPERTY makrosunun yaps u ekildedir: s s Q_PROPERTY(type name READ getFunction [WRITE setFunction] [RESET resetFunction] [DESIGNABLE bool] [SCRIPTABLE bool] [STORED bool]) name, QVariant[16] tarafndan desteklenen bir tip olabilir yada yukardaki rnekteki gibi o snf ierisinde tanmlanan bir tip olabilir. c getFunction, const olmaldr. Dndu cevabn tipi da, ya ilgili tipin kendisi, ya o tipte bir o ug pointer yada yine o tipte bir referans olmaldr. semeli setFunction, void dnmelidir ve sadece tek bir deitirge (parameter) almaldr. c o gs Alnan deitirgenin tipi, ilgili tipin kendisi, ya ilgili tipte bir pointer, yada ilgili tipte bir gs const reference olmaldr. semeli resetFunction, zellii ilk haline geri evirecek fonksiyon. Hibir deitirge almamal c o g c c gs ve void dnmelidir. o semeli DESIGNABLE, GUI tasarm arcnda bu zelliin kullanm ap kapatmak iin c o g c c kullanlr. Ontanml deer yazlabilen zellikler iin evettir. g o c semeli SCRIPTABLE, Betik motoru tarafndan kullanma uygunluu belirtir. Ontanml c g deer evettir. g semeli STORED, Objenin durumu kaydedilirken, bu zelliin deerinin hatrlanp hatrlanmayacan c o g g g belirtir. Ontanml deer evettir. Yazlamayan deerler iin kullanlmas mantkl deildir. g g c g

Qt - Eclipse balants g

10 Temmuzda Eclipse ile Qt yi birbirine balamak iin bir eclipse eklentisi test srm yaynland[17]. g c uu u Qt eklentisi yklemesini yapmadan nce Eclipsete C/C++ destei iin kullanlan CDT eku o g c lentisini kurmanz gereklidir. Bu ilemi Eclisein Help > Software Updates > Find and install s mensnden yapabilirsiniz. Eliniz demiken bir de Eclipse sisteminiz iin gncelleme yaparsanz uu g s c u iyi olacaktr. Qt - Eclipse balants eklentisi test srm olduu iin, Eclipsei gncel tutmakta g uu u g c u fayda olacaktr. Haberde verilen balantdan[18] indirebileceiniz paketi, eclipse klasrnzn uzerine atnz g g ou u u c g zaman Help > Cheat Sheets > Qt Development yoluyla aabileceiniz bir anlatm mevcut. c g Bu anlatmda anlatld uzere, Window > Preferences > Qt panelinden, sistemdeki Qt ykleg u menizin yerini belirtmeniz gerekiyor. Kullandm Debian sistemde libqt4* paketleriyle kurduum Qt kurulumunda, istenen deerleri g g g 4.0 ve /usr olarak girdiimde Qt yi Eclipsee gstermeyi baardm. g o s Bir not, eer qt3 srm nceden ykl ise, qmake komutu eski qmake-qt3 komutuna iaret g uu uo u u s ediyor olabilir. Bu durumda komut satrndan ardnz qmake komutunun doru qmake c g g g (qmake-qt4) komutuna iaret ettiinden emin olun. s g Eer Qt yklemenizi baaryla belirtebilirseniz, New > Project > Other > Qt ve Qt Designer g u s mensnden yeni bir Qt projesi balatabilirsiniz. uu s s Iaret edilecek zellikler: o 7

Window > Show View mensnden seilebilecek bir ok Qt arac. uu c c ui dosyalarn Eclipsein iinden Qt Designer kullanarak dzenleyebilme. c u

Kaynaklar
[1] http://cankavaklioglu.name.tr/ [2] Cerberus http://robot.cmpe.boun.edu.tr/aibo/home.php3 [3] The Independant Qt Tutorial - http://www.digitalfanatics.org/projects/qt tutorial/ [4] Qt 4.0: Qt Tutorial - http://doc.trolltech.com/4.0/tutorial.html [5] Qt 4.0: How to Learn Qt - http://doc.trolltech.com/4.0/how-to-learn-qt.html [6] Qt 4.2 Whitepaper - http://dist.trolltech.com/pdf/qt42-whitepaper-a4.pdf [7] Qt 4.0: Qt Object Model - http://doc.trolltech.com/4.0/object.html [8] Qt 4.0: Qt Signals and Slots - http://doc.trolltech.com/4.0/signalsandslots.html [9] Qt 4.0: Examples - http://doc.trolltech.com/4.0/examples.html [10] Qt 4.0: Installation - http://doc.trolltech.com/4.0/installation.html [11] Qt 4.0: Qt Tutorial 1 - http://doc.trolltech.com/4.0/tutorial-t1.html [12] Qt 3.1: qmake User Guide - http://doc.trolltech.com/3.1/qmake-manual.html [13] Downloads Trolltech - http://trolltech.com/developer/downloads [14] Qt 4.0: Qts Property System - http://doc.trolltech.com/4.0/properties.html [15] Qt 4.0: Meta-Object System - http://doc.trolltech.com/4.0/metaobjects.html [16] Qt 4.0: QVariant Class Reference http://doc.trolltech.com/4.0/qvariant.html [17] Trolltech Provides Qt Developers Access to Eclipse with Integration Release Canadidate http://trolltech.com/company/newsroom/announcements/press.2007-07-10.3777186202 [18] http://trolltech.com/download?target=ftp://ftp.trolltech.com/qteclipse/qt4eclipse-0.0.7linux.x86.tar.gz

You might also like