Qt ye Giriş. Can Kavaklıoğlu. 19 Temmuz 2007. Trolltech in Qt 4.0 alt yapısını kullanarak programlama yapmak için gerekli kütüphaneleri yüklemek



Benzer belgeler
Qt ye Giriş. Can Kavaklıoğlu. 10 Temmuz Trolltech in Qt 4.0 alt yapısını kullanarak programlama yapmak için gerekli kütüphaneleri yüklemek

Qt ile Programlama. İşbaran Akçayır

Qt ile Bir Ağ Uygulaması

Qt Temelleri. Eren BAŞTÜRK.

QT Eğitimi - 4 : İkili Saat (Binary Clock)

Parçacık (Widget) Eren BAŞTÜRK

BİL-142 Bilgisayar Programlama II

JAVA PROGRAMLAMAYA GİRİŞ

C# Programlama Dili. İlk programımız Tür dönüşümü Yorum ekleme Operatörler

Karma C/C + + Kodlama

Göstericiler (Pointers)

KOCAELİ ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ

Glade. hitokiri. Eylül, 2012

Pointer Kavramı. Veri Yapıları

Bİ L 131 Hafta 2. 1) Bilgisayara Java SE Development Kit 7 kurulması

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

MOBİL UYGULAMA GELİŞTİRME

NESNEYE YÖNELİK PROGRAMLAMA

QT Eğitimi - 2 :Yerleşim (Layout)

HSancak Nesne Tabanlı Programlama I Ders Notları

BİL BİLGİSAYAR PROGRAMLAMA (JAVA)

Program Nedir? Program, bir problemin çözümü için herhangi bir programlama dilinin kuralları ile oluşturulmuş komut kümesidir.

5.HAFTA. Sınıf ve Nesne Kavramı, Metot Oluşturma, Kurucu Metot, this Deyimi

Önemli noktalar. Paradigma Nesnelere Giriş Mesajlar / Ara bağlantılar Bilgi Gizleme (Information Hiding ) Sınıflar(Classes) Kalıtım/Inheritance

Hızlı Sistem Kurulumu ve Yönetimi İçin Yeni Bir Yaklaşım: SUSE Stüdyo


C#(Sharp) Programlama Dili

Paket Erişimleri. Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 4 1

Dr. Fatih AY Tel: fatihay@fatihay.net

Qt 4 ile C++ GUI Programlama

12 TBT / WEB TASARIM ve PROGRAMLAMA ( Not 3 )

MAT213 BİLGİSAYAR PROGRAMLAMA I DERSİ Ders 1: Programlamaya Giriş

Turquaz Windows kurulum dökümanı. ftp://ftp.mirror.ac.uk/sites/ftp.postgresql.org/binary/v7.3.1/windows/pgsql731wina1.exe

BİL-141 Bilgisayar Programlama I (Java)

C Konsol ve Komut Satırı

Erişim konusunda iki taraf vardır:

C PROGRAMLAMA D İ L İ

C++ Giriş Ders 1 MSGSU Fizik Bölümü Ferhat ÖZOK Kullanılacak kaynak: Published by Juan Soulié

Bu makalede 2003 sunucu, Windows 2003 Server anlamına gelmektedir. Aşağıda yapılan işlemler 2003 R2 sunucu üzerinde denenmiş ve çalıştırılmıştır.

Fonksiyonlar. C++ ve NESNEYE DAYALI PROGRAMLAMA 51. /* Fonksiyon: kup Bir tamsayının küpünü hesaplar */ long int kup(int x) {

Çoktan Seçmeli Değerlendirme Soruları Akış Şemaları İle Algoritma Geliştirme Örnekleri Giriş 39 1.Gündelik Hayattan Algoritma Örnekleri 39 2.Say

BİLG Dr. Mustafa T. Babagil 1

Java da Soyutlama ( Abstraction ) ve Çok-biçimlilik ( Polymorphism )

Kaynak Kodlardan Derleme. Turquaz Muhasebe. Versiyon 0.2. Hüseyin Ergün. 26 Mart 2005

Chain of Responsibility Tasarım Şablonu KurumsalJava.com

Java 2 Standart Edition SDK Kurulum ve Java ya Giriş

4. Bölüm Programlamaya Giriş

BM-209 Nesne Yönelimli Programlama. Yrd. Doç. Dr. İbrahim Alper Doğru Gazi Üniversitesi Teknoloji Fakültesi Bilgisayar Mühendisliği Bölümü

Yükleme kılavuzu Fiery Extended Applications 4.2 ile Command WorkStation 5.6

C için tümleşik geliştirme ortamı (IDE) kurulumları

ECLIPSE IDE C/C++ Geliştiricileri Đçin

HSancak Nesne Tabanlı Programlama I Ders Notları

Hızlı Başlangıç Kılavuzu

Qt Pencereleri. Pencere var, pencere var. Designer Dosyaları. Kaya Oğuz. Bu belge ve içerisindeki kodlar GPL lisanslıdır.

Bilgi ve İletişim Teknolojileri (JFM 102) Ders 7. LINUX OS (Sistem Yapısı) BİLGİ & İLETİŞİM TEKNOLOJİLERİ. LINUX Yapısı

Bilgiyolu Yayıncılık Elektronik Sunum Programı Kurulum Kılavuzu

ECLIPSE PROGRAMININ ÇALIŞTIRILMASI

Statik veri üyeleri sınıf dosyası içerisinde, ancak sınıf bildirimi dışında başlatılmalıdır. Statik üye fonksiyonları

Kalıtım (Inheritance)

İNÖNÜ ÜNİVERSİTESİ MÜH. FAK. BİLGİSAYAR MÜH. BÖL. ALGORİTMA VE PROGRAMLAMA 1 DERSİ LAB. ÖDEVİ

şeklinde tanımlanmıştır. O halde, dosyaları daha önceki bilgilerimizi kullanarak FILE *Dosya1, *Dosya2;

MVC. Görüldüğü üzere 2 adet cs. Dosyası oluşturdum. Birincisi çok satır kodu (20-25) içeren büyük işlerin yapılacağı class. İsmi buyuk_isler.

Mühendislik Fakültesi Elektrik-Elektronik Mühendisliği C Programlama 7. Bölüm Metot Tanımlama ve Kullanma

OMNET Ağ Benzetim Yazılımı (Network Simulation Framework) BİL 372 Bilgisayar Ağları. GYTE - Bilgisayar Mühendisliği Bölümü

EndNote Web Hızlı Başvuru kartı

Toplu Kayıt Kullanıcı Kitapçığı

Bölüm 10. Altprogramların gerçeklenmesi ISBN

Flash ile Etkileşimli Öğretim Materyali Hazırlama Semineri

C++ Dersi: Nesne Tabanlı Programlama

Görsel Programlama 1

HUAWEI Cihazlara Erişim Yöntemleri

ZWCAD Önemli. Tek Kullanıcı Sürümü Lisans Kodu Kullanarak Yükleme Kılavuzu

1. Aşağıdaki program parçacığını çalıştırdığınızda result ve param değişkenlerinin aldığı en son değerleri ve programın çıktısını yazınız.

Qt Temelleri. Eren BAŞTÜRK.

ELN1001 BİLGİSAYAR PROGRAMLAMA I

Linux Assembly Programlamaya Giriş

JAL IN İNTERNET TEN İNDİRİLMESİ VE KURULMASI

Karabük Üniversitesi, Mühendislik Fakültesi... WEB TEKNOLOJİLERİ

Android e Giriş. Öğr.Gör. Utku SOBUTAY

Fonksiyonlar (Altprogram)

Pascalda oluşturulacak dosyalar değişkenler gibi programın başında tanımlanır.

The RestructuredText Book Documentation

Bil101 Bilgisayar Yazılımı I. M. Erdem ÇORAPÇIOĞLU Bilgisayar Yüksek Mühendisi

Tomcat Uygulama Sunucusunun Kurulumu. İlk olarak adresine gidiyoruz.

AHMET YESEVİ ÜNİVERSİTESİ BİLİŞİM SİSTEMLERİ VE MÜHENDİSLİK FAKÜLTESİ BİLGİSAYAR MÜHENDİSLİĞİ LİSANS DÖNEM ÖDEVİ

Eln 1002 Bilgisayar Programlama II

Linux Ubuntu Kurulumu

Data Structures Lab Güz

Yrd. Doç. Dr. Caner ÖZCAN

ANA SINIF TÜRETİLEN BİRİNCİ SINIF TÜRETİLEN İKİNCİ SINIF

BMÜ-111 Algoritma ve Programlama. Bölüm 5. Tek Boyutlu Diziler

C++ Dersi: Nesne Tabanlı Programlama

Sınav tarihi : Süre : 60 dak.

MOBİL UYGULAMA GELİŞTİRME

Sunum İçeriği. Programlamaya Giriş

GĐRĐŞ. 1 Nisan 2009 tarihinde BDP programının yeni bir sürümü yayınlanmış ve bu sürümde yapılan değişikliklere

DESTEK DOKÜMANI. Ürün : Tiger Enterprise/ Tiger Plus/ Go Plus/Go Bölüm : Kurulum İşlemleri

Transkript:

Qt ye Giriş Can Kavaklıoğlu 19 Temmuz 2007 1 Önsöz Bu yazı Can Kavaklıoğlu[1] tarafından, Cerberus[2] takımının ihtiyaçları doğrultusunda yazılmıştır. Doğu Kaya ya elzem yardımlarından için teşekkürler. Yazıdaki hataları, önerileri, soruları ve/veya yazının oluşturduğu tepkileri eposta@cankavaklioglu.name.tr adresine yollarsanız pek de güzel olur. Herzamanki gibi bu yazıda yazanlar etkisinde kalarak yaptığınız hareketlerden yazar sorumlu değildir. sürüm 1.2 - Temmuz 2006 2 Gereksinimler Trolltech in Qt 4.0 alt yapısını kullanarak programlama yapmak için gerekli kütüphaneleri yüklemek için: Debian sisteminde qt4-dev-tools paketini yüklemeniz yeterli olacaktır. Diğer birkaç sistemin paketi de mevcuttur[13]. Herhangi bir Linux sisteminde indireceğiniz.tar.gz dosyası ile kurulumu gerçekleştirebilirsiniz. Diğer sistemler için kurlum ve diğer konularda detaylı anlatım için [10]. 3 Hello World Programla ilgili her konuda olduğu gibi ilk önce ekrana Hello World yazdıran program ile işe başlayalım: Bu kodu gcc helloworld.cpp komutu ile çalıştırdığınızda şöyle bir hata kümesi ile karşılaşıyorsanız: helloworld.cpp:1:28: QApplication: No such file or directory helloworld.cpp:2:27: QPushButton: No such file or directory gcc programı kütüphanelerinizi bulamıyor demektir. Daha doğrusu qmake kullanarak, düzgün bir Makefile oluştumanız gerekiyor demektir. qmake in de doğru sürümünü kullandığımıza dikkat etmemiz gereklidir. Bunu anlamanın en iyi yolu aşağıdaki komutların çıktısındaki ilk satırlara bakarak, hangi Qt sürümü kullanıldığını yazan satıra göz atmaktır. Benim sistemimde bu komut şöyle çalışıyor: 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(); Şekil 1: Örnek: Hello World[11] qmake -project -nopwd helloworld.cpp Komutu bir adet klasöradı.pro dosyası oluşturuyor. Bu dosyanın içerisinde qmake in Makefile ını oluşturacağı projeyi temsil ediyor. Eğer bulunduğumuz klasördeki bütün.cpp ler projeye katılsın istiyorsak, o zaman son iki parametreyi vermeden de komutumuzu çağırabiliriz: qmake -project qmake.pro dosyamızı oluşturduktan sonra gerekli Makefile ı oluşturması için komutunu çağırıyoruz ve Makefile ımız oluştuyor. Burada dikkat edilecek nokta (en azından benim sistemimde öyle idi) qmake komutu Qt 3.0 sürümünün qmake ini kullanıyordu. Bu da yanlış Makefile oluşmasına sebep oluyordu. O yüzden oluşan Makefile ın ilk satırlarını kontrol ederek orada Qt 4... ifadesinin geçtiğine emin olmak gereklidir. Benim sistemimde bunu yapabilmek için qmake yerin şu komutu kullanmam gerekti: qmake-qt4 make Düzgün bir Makefile oluştu ise, Makefile ın bulunduğu klasörde, komutu ile ilk Qt programımızı oluşturduk demektir. Çalıştırmak için komut satırından./<klasöradı> komutu ile programı çalıştırabiliriz. 2

4 Sinyaller ve Yuvalar (Signals and Slots) Qt nin objeler arası iletişim için kullandığı yapılar Sinyaller ve Yuvalar[8] olarak adlandırılırlar. Throlltech in dediğine göre eski sistemlerde kullanılan birbirine pointer gönderip, callback yaptırmak, hem type-safe olmadığı, hem de strongly coupled olduğu için sakıncalı oluyormuş. Bu yüzden bu yeni sistemlerini oluşturmuşlar. Binevi Sony nin OPEN-R sistemindeki gibi Subject(Signal) ve Observer(Slot) lar mevcut. Bir sinyal iki yuvaya bağlanabiliyor. Yukariki iki probleme verilen cevap ise şöyle: Bağlantılar tek elden bir fonksiyon imzası (function signature) ile belirtildiği için tip çakışma problemleri yaşanmıyor. Hatta bu açık ayırım sayesinde derleyici bize olası hataları gösterebiliyor. Loosely coupled yapı sayesinde, sinyali yayan objeler, yuva sahibi objelerle kurdukları bağlantılarda direk ilişki kurmadıkları için, strongly coupled sistemlerdeki sinyal yayan objelerin, bütün yuva sahibi objelerden haber olma zorunluluğu yoktur. Sinyal ve yuvaların birkaç özellikleri: Sinyaller ve yuvalar, bağlantılarından haberdar değillerdir. Bir yuvaya gerektiği kadar sayıda sinyal bağlanabilir. Bir sinyale gerektiği sayıda yuvaya bağlanabilir. Sinyaller sinyallere de bağlanabilir, bu durum, birinci sinyal oluştuğunda, ikinci sinyali tetikleyecektir. Bir sinyal oluştuğunda, kodun çalışması sinyali oluşturan satırın altına, ancak sinyalin yuvasından geri dönüş olduğunda devam eder. Eğer bu durum yerine, yuvadaki işlemin ayrı bir süreç olarak devam etmesi isteniyorsa, sıralı bağlantı (queued connections) yöntemi kullanılır. Yuvaların erişim hakları, hangi sinyallerin bu yuvaya bağlanabileceğini belirtir. 3

4.1 Sinyal ve Yuvalar Örneği 2. şekildeki örnekte Counter (sayaç) sınıfı, bir yuva ile tuttuğu sayıyı değiştirir. Oluşturduğu bir sinyal ile de, kendisini izleyenlere, sakladığı değerin değiştiğini haber verir. #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; }; Şekil 2: Örnek: Sinyaller ve yuvalar[8] Saklanan değişmesi sinyalinin üretilmesinin en uygun noktası ise setvalue fonksiyonu olacaktır: void Counter::setValue(int value) { if (value!= m_value) { m_value = value; emit valuechanged(value); } } Şekil 3: Örnek: Sinyaller ve yuvalar: setvalue fonksiyonu [8] Dikkat edilecek satır emit valuechanged(value); satırıdır. Bu komut ile, signals: ifadesi ile belirttiğimiz bölümdeki void valuechanged(int newvalue); fonksiyon çağırılarak oluşturulan sinyal yayılır. Daha açık bir örnek için 4. şekile bakınız: 4

Counter a, b; QObject::connect(&a, SIGNAL(valueChanged(int)), &b, SLOT(setValue(int))); a.setvalue(12); // a.value() == 12, b.value() == 12 b.setvalue(48); // a.value() == 12, b.value() == 48 Şekil 4: Örnek: Sinyaller ve yuvalar: bir sinyali yuvaya bağlamak [8] Bu örnekte gösterilen işlemler şunlardır: 1. İki tane Counter objesi, a ve b oluşturulur. 2. a ve b objeleri birbirlerine bağlanırlar. Bağlama komutundaki değiştirge sıralaması şöyledir: sinyali oluşturan obje, sinyal, sinyali alan obje, yuva. Bu şekilde sinyal ve yuva tanımlarken, SIGNAL ve SLOT makroları kullanılmak zorundadır. 3. a.setvalue(12); komutu a objesinin sakladığı değeri 12 ye eşitler, ve hemen ardından, valuechanged(int) sinyali oluşturmasını sağlar. Bu sinyal b objesinin setvalue(int) yuvasına ulaşır ve b objesinin sakladığı değer de 12 ye eşitlenir. 4. b.setvalue(48); ise sadece b objesinin değerini değiştirebilir, çünkü a objesinin yuvası hiçbir sinyale bağlanmadığı için, b objesinin setvalue(int) fonksiyonu tarafından oluşturulan sinyal a objesine ulaşmaz. 5 Meta-Obje Sistemi Qt nin Meta-Obje Sistemi[15], başta sinyal ve yuvalar sistemi olmak üzere birkaç işlev sunar: QObject::metaObject() ilgili sınıfın meta objesini verir. QMetaObject::className() RTTI desteğine gerek duymadan çalışan sınıfın adını obje çalışırken verir. QObject::inherits() istenen sınıfın ilgili sınıf tarafından kullanılıp (inherit) kullanılmadığını belirtir. QObject::tr() ve QObject::trUtf8() karakter dizilerini istenen dile çevirir. QObject::setProperty() ve QObject::property() dinamik olarak obje özelliklerinin değiştirir ve verir. Meta-Obje Sistemi aynı zamanda dynamic cast() işlemi için de kullanılabilir. 6 Özellikler Sistemi Qt nin Özellikler Sistemi (Property System [14] ) bir sınıfın içerisindeki standart veri yapılarına denk gelir. Ancak aşağıda belirtilen birkaç önemli işlev sağlar: Okuma fonksiyonu her zaman mevcuttur. İstenirse yazma fonksiyonu her zaman mevcut olabilir. Kayıtlı ( stored ) özniteliği, özelliğin kaydedilip edilmediğini belirtir. 5

Ender olsa da yeniden başlatma ( reset ) fonkiyonu. Tasarlanabilir ( designable ) özniteliği, ilgili özelliğin, Qt Designer gibi bir tasarlama programında gösterilip, gösterilmeyeceğini belirtir. Q PROPERTY() makrosu kullanılarak tanımlanır. Bu makro ancak QObject i kullanan (inherit) sınıflarda kullanılabilir. 6.1 Özellik 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); Şekil 5: Örnek: Özellik okuma yazma örneği[14] button->setdown(true) yöntemi derleyicinin, derleme sırasında hataları raporlayabilmesini sağlar. button->setpropety("down",true); yöntemi ise derleme sırasında kullanılabilir olmayan özellikleri programın çalışması sırasında erişebilmemizi sağlar. Özellikler Sisteminin diğer belirtilen diğer iki fonksiyonu ise şunlar: QMetaObject::propertyCount() bir objenin kullanılabilecek bütün özelliklerini verir. QMetaObject::property() istenen objenin istenen özelliğini bir QMetaProperty objesi olarak verir. 6.2 Özellikler Sistemi Örneği 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; Şekil 6: Örnek: Özellik okuma yazma örneği[14] 6

Bu tanımlamayı kullanmak için şöyle bir ifade deneyebiliriz: obj->setproperty("priority", "VeryHigh"); Q PROPERTY makrosunun yapısı şu şekildedir: Q_PROPERTY(type name READ getfunction [WRITE setfunction] [RESET resetfunction] [DESIGNABLE bool] [SCRIPTABLE bool] [STORED bool]) name, QVariant[16] tarafından desteklenen bir tip olabilir yada yukarıdaki örnekteki gibi sınıf içerisinde tanımlanan bir tip olabilir. getfunction, const olmalıdır. Döndüğü cevabın tipi da, ya ilgili tipin kendisi, ya o tipte bir pointer yada yine o tipte bir referans olmalıdır. seçmeli setfunction, void dönmelidir ve sadece tek bir değiştirge ( parameter ) almalıdır. Alınan değiştirgenin tipi, ilgili tipin kendisi, ya ilgili tipte bir pointer, yada ilgili tipte bir const reference olmalıdır. seçmeli resetfunction, özelliği ilk haline geri çevirecek fonksiyon. Hiçbir değiştirge almamalı ve void dönmelidir. seçmeli DESIGNABLE, GUI tasarım arıcında bu özelliğin kullanımı açıp kapatmak için kullanılır. Öntanımlı değer yazılabilen özellikler için evettir. seçmeli SCRIPTABLE, Betik motoru tarafından kullanıma uygunluğu belirtir. Öntanımlı değer evettir. seçmeli STORED, Objenin durumu kaydedilirken, bu özelliğin değerinin hatırlanıp hatırlanmayacağını belirtir. Öntanımlı değer evettir. Yazılamayan değerler için kullanılması mantıklı değildir. 7 Qt - Eclipse bağlantısı 10 Temmuz da Eclipse ile Qt yi birbirine bağlamak için bir eclipse eklentisi test sürümü yayınlandı[17]. Qt eklentisi yüklemesini yapmadan önce Eclipse te C/C++ desteği için kullanılan CDT eklentisini kurmanız gereklidir. Bu işlemi Eclise in Help > Software Updates > Find and install menüsünden yapabilirsiniz. Eliniz değmişken bir de Eclipse sisteminiz için güncelleme yaparsanız iyi olacaktır. Qt - Eclipse bağlantısı eklentisi test sürümü olduğu için, Eclipse i güncel tutmakta fayda olacaktır. Haberde verilen bağlantıdan[18] indirebileceğiniz paketi, eclipse klasörünüzün üzerine açtığınız zaman Help > Cheat Sheets > Qt Development yoluyla açabileceğiniz bir anlatım mevcut. Bu anlatımda anlatıldığı üzere, Window > Preferences > Qt panelinden, sistemdeki Qt yüklemenizin yerini belirtmeniz gerekiyor. Kullandığım Debian sistemde libqt4* paketleriyle kurduğum Qt kurulumunda, istenen değerleri 4.0 ve /usr olarak girdiğimde Qt yi Eclipse e göstermeyi başardım. Bir not, eğer qt3 sürümü önceden yüklü ise, qmake komutu eski qmake-qt3 komutuna işaret ediyor olabilir. Bu durumda komut satırından çağırdığınız qmake komutunun doğru qmake (qmake-qt4) komutuna işaret ettiğinden emin olun. Eğer Qt yüklemenizi başarıyla belirtebilirseniz, New > Project > Other > Qt ve Qt Designer menüsünden yeni bir Qt projesi başlatabilirsiniz. İşaret edilecek özellikler: 7

Window > Show View menüsünden seçilebilecek bir çok Qt aracı. ui dosyalarını Eclipse in içinden Qt Designer kullanarak düzenleyebilme. 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: Qt s 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.7- linux.x86.tar.gz 8