18 Mart 2011 Cuma

QT Jambi

Bu yazı daha önce saltokunur.org dergisinin Şubat 2010 sayısında yayınlanmıştır. QT Jambi’nin 4.5.2 sürümü temel alınarak hazırlanmıştır.
 
Java serüveninize hevesle başladınız ve her yeni başlayan gibi bir an önce görsel programlar yapmak istediniz. Ama Java'nın sunduğu arayüz kütüphanesi Swing o kadar zordu ki bir türlü istediğiniz görsellikte programlar ortaya çıkaramadınız. Belki de sırf bu yüzden bu güzelim programlama dilinden vazgeçtiniz ve başka dillere yöneldiniz. Gerçek şu ki Java'da arayüz programlamak için Swing'e mahkum değilsiniz. Karşınızda: QT Jambi
 


2008 yılında PcNet dergisinde Türkiye'deki yazılım sektöründe hangi dillerin revaçta olduğunu inceleyen bir yazı okumuştum. Yazıda Türkiye'nin önde gelen yazılım firmalarının görüşlerine yer verilmişti. Yazının özeti şu idi: "Programlama dili olarak Türkiye'de C# ve Java en çok tercih edilenlerdir. Bu dilleri biliyorum diyen hiçbir kimse işsiz kalmaz." Bugün baktığımızda yazının üzerinden 2 yıl geçmiş ve popüler dillerin C# ve Java olduğu gözlemi hala geçerliliğini koruyor.

Bu dillerden C#, arkasında Microsoft olduğu ve Türkiye'deki son kullanıcıların neredeyse tamamının bu firmanın ürünlerini kullandığı, öğrenilmesi ve uygulaması kolay olduğu, kullanıcıların tamamının kullandığı bir platforma görsel nitelikleri ön planda olan yazılımlar geliştirmeyi çok basit bir hale getirdiği için tercih ediliyor.
Java ise, Windows platformlarının virüs belasıyla uğraşmak istemeyen, verilerinin güvenliğini ön planda tutan büyük şirketler tarafından tercih ediliyor. Bir diğer önemli etken ise açık kaynak ve taşınabilir olması. Bir yazılımın açık kaynak olması sizin için çok şey ifade etmiyor olabilir. Açık kaynak yazılımın avantajı şöyle özetlenebilir: Yazılım geliştirmeyle uğraşan herkesin kodlarına bakarak program hakkında bir fikir yürütebilmesini sağlıyor ve böylece kaynağının ve üzerinde değişiklik yapabilme yetkisinin sadece belli bir kesime açık olduğu projelerden çok daha hızlı gelişebiliyor ve daha yetenekli oluyor. Bugün buna en güzel örnekler binlerce Firefox eklentisi ve Java tarafında yazılım gelişmeye yardımcı onlarca Framework. İşte bu artıları Java'yı ön plana çıkarıyor.

Arayüz Kodlamak Mı? Swing'le Asla!
Java'nın bu rekabette en büyük dezavantajı her şeyi taşınabilir hale getirmeye çalışması. Her şeyi taşınabilir hale getirmeye çalışmakla bir çok önemli noktada tavizler veriyor ve sadece belli bir platforma destek veren teknolojilerden geri kalıyor. Örneğin Java'ya yeni başlayan birinin kolaylıkla öğrenip diğer kütüphanelerle yapılabilecek kadar güzel görsellikte arayüzler tasarlamaya imkan veren resmi (resmi diyorum, çünkü konumuz 3. parti bir kütüphane olan QT Jambi) bir kütüphanesi bulunmuyor. Java'nın sağladığı Swing arayüz kütüphanesi öğrenilmesi çok zor ve albenili programlar yapılabilmesi için üzerinde çok çalışılması gereken, zamanının gerisinde kalmış bir kütüphane. Bugün piyasada Swing ile tasarlanmış çok az program görebilirsiniz. Bir çarpıcı örnek de şu ki, Java'da yapılmış bir tane bile video oynatıcı uygulama yok. Çünkü Java güncel hiçbir codec'i desteklemiyor. Bir kaç tane müzik oynatıcı program var onlar da ancak 3. parti kütüphaneleri kullanarak (JLayer) güncel codec'lere destek sağlıyor. Tüm bir JRE (Swing, AWT, I/O, Networking, Math, Collections) yaklaşık 13 MB iken, yazımızın konusu olan QT Jambi sadece GUI tasarımı için sunulan yaklaşık 20 MB'lık bir kütüphane. QT Jambi'nin eksi tarafı ise bir ölçüde taşınabilirlikten ödün vermesi. Çünkü her platform için, arayüz bileşenlerinin ekrana nasıl render edileceğini spesifik olarak belirten platforma özel bir .jar dosyasını uygulamaya eklemek gerekiyor. Aslında bir .jar dosyasını değiştirmek taşınabilirlikten çok da ödün vermek olmasa gerek.

QT Jambi Nedir?
Yazımızın konusu olan QT Jambi bir Java GUI kütüphanesi. QT'yi muhtemelen duymuşsunuzdur. QT C++ dilinde yazılmış, tüm platformlarda çalışan bir arayüz kütüphanesidir. Linux kullanıcılarının çok iyi bildiği KDE masaüstü ortamı ve çeşitli programlar (Skype v.b.) bu kütüphane ile yazılmıştır. QT Jambi ise QT'nin Java dilinde kodlanmış (Port edilmiş) halidir.

QT Jambi temelde iki ayrı lisansla dağıtılıyor. Ücretsiz ve açık kaynak olan LGPL versiyonu ve ticari versiyonundan istediğinizi ihtiyaçlarınıza göre seçebilirsiniz.

QT Jambi günümüzün popüler birçok platformunda çalışır. Uygulama bir kez Java'da derlendikten sonra asıl uygulamanın yanına platforma özgü kütüphaneleri ekleyerek, Java'nın “bir kere yaz her yerde çalıştır” mantığıyla program geliştirmeye devam edebilirsiniz.

QT Jambi'nin bence en önemli özelliği ise Olay İşleme (Event Handling)'ye getirdiği yeni yaklaşım. Signal (Sinyal) – Slot (Yuva) mekanizması sayesinde ne olayı oluşturan nesne ne de olayı alan nesne birbirinden haberdar olmak zorunda kalmıyor ve Loose Coupling'in başarımı büyük ölçüde sağlanıyor.
QT Jambi varsayılan olarak programlara çoklu dil desteği sağlıyor. Kaynak kodda String olarak yazılan her ifade tr(String) metodu içinde yazılır. Daha sonra bu String ifadeler bir dil dosyasında toplanır. Programın çalışması sırasında dinamik olarak dil dosyalarından bu ifadeler çekilerek ekranda istenilen dilde gösterilir.

QT Jambi ile Çalışmak
QT Jambi'yi http://qt-jambi.org/downloads/ adresinden indirebilirsiniz. İndirme sayfasındaki dosyalardan kendi platformunuza uygun sürümünü (Linux için qtjambi-linux32-lgpl-) seçtiğinize emin olun. Sıkıştırılmış dosyanın içinden çıkan qtjambi-xxx.jar ve qtjambi-linux32-gcc-xxx.jar dosyalarını herhangi bir IDE'ye kütüphane olarak ekledikten (aslında sadece CLASSPATH'e eklemeniz yeterli) sonra QT Jambi ile uygulama geliştirmeye başlayabilirsiniz. Aynı adreste QT Jambi'nin Eclipse IDE'si için pluginini de bulabilirsiniz. Bu pluginle Eclipse üzerinde görsel olarak QT Jambi geliştirebilirsiniz.
İndirdiğiniz sıkıştırılmış dosya QT Jambi ile uygulama geliştirmek için gerekli her şeyi içerir.
Designer: Görsel bir şekilde QT Jambi uygulamaları tasarlayabileceğiz program. Tasarladığınız arayüzü .jui (Designerda tasarlanan arayüz elemanlarının yerleşimlerin tutulduğu bir XML dosyası) uzantısıyla kaydedip, qtjambi-linux32-lgpl-xxx/bin klasörünün içindeki juic programıyla derlenebilir .java kodlarına dönüştürebilirsiniz. Ama en kolayı Eclipse pluginini kullanıp her şeyi Eclipse'in halletmesini sağlamak.



QtJambi-Examples: Kaynak kodlarıyla birlikte verilen, açıklamalı QT Jambi örnekleri.















QT Jambi Doc: Referans belgeleri.
Bunların dışında asıl QT'nin C++ sürümüyle birlikte gelen ancak biraz C++ biliyorsanız QT Jambi'nin mantığını anlamada size yardımcı olabilecek şu araçlar da var.
QT Creator: Designer'ın daha gelişmiş C++ sürümü.
QT Assistant: QT ile ilgili herşey. Sınıfların ayrıntılı açıklamaları, adım adım örneklerin incelemeleri, herşey... QT ve QT Jambi ile uygulama geliştirirken ilk başvuru kaynağınız olacak.
Qt Linguist: QT'nin yerleşik çoklu dil desteğini veren, String ifadeleri dil dosyalarına dönüştüren program.
 
QT Jambi Paketleri
QT Jambi'nin 4.5.2 sürümüyle gelen paketler ve bu paketlerdeki sınıflar ise şunlar:
com.trolltech.qt ve com.trolltech.qt.core: Çekirdek QT Jambi sınıfları.
com.trolltech.qt.designer: Designer uygulamasının kullandığı sınıflar.
com.trolltech.qt.gui: Buton, Label, TextBox, Table gibi temel arayüz elemanlarının sınıflarının bulunduğu paket.
com.trolltech.qt.network: QT Jambi'nin ağ iletişimi yapabilmesini sağlayan sınıflar. Bu paketteki sınıflar sayesinde QT Jambi ile Server/Client yazılımlar hazırlanabilir.
com.trolltech.qt.opengl: Uygulamalarınıza OpenGL'in gücünü katabileceğiniz QT Jambi paketi.
com.trolltech.qt.phonon: Multimedia uygulamaları geliştirebileceğiz QT Jambi paketi. Bu pakette çok güçlü sınıflar bulunuyor. Sadece bir sınıfın örneğini oluşturarak çok kolay bir şekilde bir video player (com.trolltech.qt.phonon.VideoPlayer), bir ses ayar düğmesi (com.trolltech.qt.phonon.VolumeSlider) veya bir video içinde gezinme çubuğu (com.trolltech.qt.phonon.SeekSlider) oluşturabilirsiniz.
com.trolltech.qt.sql: Bu kadar desteği sağlayan Qt Jambi, SQL'den de geri durmuyor. Bu paketin içinde günümüzün en çok kullanılan veritabanları için sürücüler bulunuyor. Normal Java uygulaması yazarken bir JDBC sürücüsü eklemek gerekirdi halbuki.
com.trolltech.qt.svg: SVG dosyalarını okuyup yazabilen sınıfların bulunduğu paket.
com.trolltech.qt.webkit: Web sitesi gösterebilme yeteneği olan uygulamalar geliştirebilmek için gerekli sınıflar...
com.trolltech.qt.xml ve com.trolltech.qt.xmlpatterns: QT Jambi bu paket sayesinde XML dosyalarını başka 3. parti kütüphanelere gerek kalmadan işleyebiliyor.

Çığır Açan Signal-Slot Sistemi
Signal-Slot sistemi Qt Jambi'nin olay işlemeye getirdiği yeni bir yaklaşımdır. Bu yaklaşımı daha iyi anlayabilmek için, Swing'in klasik olay işleme mekanizmasına değinip Signal-Slot sistemi ile karşılaştıracağız.
Swing'de arayüz bileşenleri seçme, butona tıklama, enter'a basma vb gibi olay nesneleri üretir. Bu olayları işlemek için, olaylar oluştuğunda yapılacak işlerin belirtildiği olay dinleyici sınıfları yazılır ve hangi olay takip edilecekse, bu sınıfların nesneleri ilgili arayüz bileşenini dinlemek üzere ayarlanır.
Örneğin bir butona tıklandığında mesaj gösterilmek isteniyorsa, önce Buton nesnesi oluşturulur.

JButton but=new Jbutton("Tıkla");

Sonra bu butona tıklandığında çalışacak kodların bulunduğu bir sınıf yazılır. Bu sınıf butonda oluşan her farklı
olay tipi için ayrı bir metot içerir.
 
public class OlayDinleyici implements ActionListener
{
 Object olayiOlusturanNesne;
 
 //tıklama olaylarında çalışacak metod
 public void actionPerformed(ActionEvent e)
 { 
  //Mesaj Göster
   olayiOlusturanNesne.herhangiMetod();
 }
}

Sonra da bu sınıfın bir nesnesi olayları oluşturan buton nesnesine eklenir.

but.addActionListener(new OlayDinleyici());

Bu tip bir yaklaşımla olay işlemek hem karmaşık, hem kodlaması zor, hem de baş edilmesi zahmetlidir. Ayrıca hem dinleyici sınıfta hem de olayı oluşturan sınıfta birbirlerinin nesnelerine bir referans bulunmasını gerektirir. Bu zorunluluk sınıfların içiçe geçmesine ve uygulamanın karmaşıklığının artmasına neden olur.

Bu soruna QT Jambi'nin getirdiği çözüm ise çığır açacak niteliktedir. Bu yaklaşım olayı oluşturan ve takip eden sınıfların birbirinden haberdar olmasına gerek olmaması temeline dayanır. QT Jambi'de arayüzde oluşan her olay (tıklama, enter'a basma) bir Signal'dir. Örneğin bir butona tıklandığında tıklama Signal'i oluşur. Signal'ler üzerinde değer taşıyabilir. Yani arayüzde bir olay oluştu ve olayı gerçekleştiren nesne de bir değer ürettiyse, üretilen değer Signal'le birlikte gönderilir. Örneğin bir textbox'a değer girildiğinde textChanged olayı oluşur. Textbox sınıfının "textChanged Signal'i" üzerinde textbox'ın metnini taşır.

Olay oluştuğunda çalışacak kodlar ise Slot'lardır. Slotlar arayüzdeki bir bileşenin bir metodu olabileceği gibi sizin yazdığınız metotlar da olabilir. Signaller üzerinde connect(QObject alici, String slot) metodunu çağırarak Signalleri Slotlara bağlamış olursunuz. Böylelikle olay yönetimi Swing'den çok daha basit bir şekilde çözülmüş olur.



Örneğin ekrandaki bir butona basıldığında uygulamadan çıkmak istiyorsunuz. Yazacağınız kod sadece şudur.

QPushButton but=new QPushButton("Çıkış");
but.clicked.connect(QApplication, "quit()");

Burada bir buton nesnesi oluşturuyoruz ve bu butonun "tıklanma" Signal'ini uygulamamızın (QT'de her uygulama bir QApplication nesnesidir) "quit()" metoduna bağlıyoruz. Böylelikle butona tıklanınca uygulama kapanmış oluyor.

Yukarıdaki textbox örneğimizi koda dökmek istersek: Textbox'a girilen değerin enter'a basıldığında bir label'da görüntülenmesini istiyoruz. Aşağıdaki üç satır kod bunun için yeterli.

QLineEdit txtBox=new QLineEdit();
Qlabel label=new QLabel();
txtBox.textChanged.connect(label, "setText(String)");

Burada bir textbox ve bir label oluşturuyoruz. Sonra Signal-Slot mekanizması kendini gösteriyor. txtBox'ın textChanged (yazı değişti) Signal'i değişen yazıyı Signal ile birlikte gönderiyor. Bu Signal'i label'ın setText(String) metoduna bağlıyoruz. Böylelikle txtBox'da bir değişim olduğunda label'da metin görüntülenmiş oluyor. Böyle bir uygulamayı Swing ile yapmaya çalışırsak öncelikle txtBox'ın içindeyi metni txtBox.getText() ile almamız, sonra label'da bu yazıyı göstermemiz gerekirdi. İşte Signal-Slot yapısının gücü.



Ben Geldim Dünya!
QT Jambi'de en temel sınıf QObject'tir. Bütün sınıflar bu sınıftan kalıtım alır. Arayüz bileşenlerinin temel sınıfı ise QWidget'tir. QWidget'ten kalıtım alan bütün sınıflar ekranda bir bileşen olarak gösterilebilir. Siz de bu sınıfı genişleterek kendi arayüz elemanlarınızı yazabilirsiniz.

QMainWindow ve QDialog QT Jambi'nin pencere sınıflarıdır. Bu sınıflara eklenen QWidget nesneleri pencerelerde gösterilir. Eğer bir QWidget nesnesi bu sınıflardan herhangi birine eklenmezse bu nesne üzerinden show() metodu çağrılarak ayrı bir pencerede göstermesi sağlanabilir.

Bir QT Jambi uygulaması QApplication.initialize(String[]) statik metodu çağrılarak hafızaya yüklenir. Bu satırdan sonra programın kodları yazılır, en son olarak da QApplication.exec() çağrılarak program çalıştırılır.
İşte Hello World örneğimiz. HelloWorld.java adıyla kaydedip, derleyip, çalıştırabilirsiniz.
import com.trolltech.qt.gui.*;

public class HelloWorld {

    public static void main(String[] args) {

        QApplication.initialize(args);

        //Buraya uygulamayı oluşturan kodlar gelir.
 QLabel hello=new QLabel("Hello World");
 hello.resize(120, 40);
        hello.setWindowTitle("Hello World");
        hello.show(); 
 //uygulama kodu sonu

        QApplication.exec();
    }
}



Şimdi de QWidget sınıfını genişleterek oluşturduğumuz kendi sınıfımızın bir nesnesini gösteren bir örnek yapalım (Signal-Slot kısmında anlattığım TextBox-Label örneği). AnaPencere adında QWidget'i genişleten bir sınıf yazıyoruz. Bu sınıfa bir Label ve bir TextBox ekliyoruz. Layout (Yerleşim) düzenini ayarlıyoruz. main() metodunun içinde bu sınıfın bir örneğinin oluşturup, üzerinden show() metodunu çağırıyoruz. Kodu AnaPencereDeneme.java adıyla kaydedin.

import com.trolltech.qt.gui.*;

class AnaPencere extends QWidget{

    public AnaPencere() {

        QVBoxLayout box=new QVBoxLayout();
        QLineEdit txtBox=new QLineEdit();
        QLabel label=new QLabel();

        box.addWidget(txtBox);
        box.addWidget(label);
        setLayout(box);     
        line.textChanged.connect(label, "setText(String)");
    }
}

public class AnaPencereDeneme {

    public static void main(String[] args) {

        QApplication.initialize(args);

        AnaPencere main=new AnaPencere();
        main.show();

        QApplication.exec();
    }
}

Ben QT Jambi ile kod yazarken Swing'e göre daha çok eğlendim. QT Jambi ile neler yapılabileceği hakkında fikir edinmek istiyorsanız, birlikte gelen örnekleri incelemenizi tavsiye ederim. Örnekleri görünce şaşıracağınıza eminim. Bazıları: Video oynatıcı, müzik oynatıcı, Excel gibi bir hesap tablosu programı, ekran görüntüsü alma programı, tetris oyunu, OpenGL uygulamaları, online anlık mesajlaşma yazılımı, web tarayıcı, windows kenar çubuğu araçları gibi masaüstünde yüzebilen başlık çubuğu olmayan araçlar, HTTP sunucuları, programlama diline göre o dilin reserved (ayrılmış) kelimelerini (for, if, while...) farklı renkte gösteren kod editörleri, sistem tepsisinde (tray) çalışan uygulamalar...

İnternet'te QT Jambi ile ilgili çok örnek yok, genelde uygulamalar QT (C++) ile yazılmış. Ama C++ örneklerini inceleyerek de Java'da neler yapmanız gerektiği hakkında fikir sahibi olabilirsiniz, sonuçta programlama dillerinin mantığı hep aynı.

Benim QT hakkında araşma yaparken karşılaştığım tek Türkçe kaynak olan Çanakkale Onsekiz Mart Üniversitesi bünyesindeki QT Türkiye Topluluğu'nu da gayretli çalışmalarından dolayı tebrik ediyorum. Eğer siz de QT ile devam etmeye karar verirseniz, lütfen öğrendiklerinizi bu toplulukta paylaşın ki QT hakkındaki Türkçe belge sayısı artsın.

Aslında QT Jambi hakkında anlatacak çok şeyim vardı. Ama bu genel bir tanıtım yazısı ve verilebilecek daha ileri seviye örnekler tanıtım yazısının sınırlarını zorlayacak nitelikte. Bundan sonrası merakınıza ve araşmacılık duygunuza kalıyor.
Peygamber Efendimiz'in bir hadisiyle bitirelim: “Merak İlmin Hocasıdır.”

Gelecek ay görüşmek dileyiğle.
Sağlıcakla kalın, Saltokunur'la kalın.

Kaynaklar
http://qt.comu.edu.tr
http://qt.nokia.com

7 yorum:

  1. Yazılan çoğu şeye katılmakla beraber, Swing'in neresi zor diyesi geliyor insanın. Fakat anladığım kadarıyla Eclipse kullanıyorsunuz, NetBeans ile birçok şey kod yazmaya gerek kalmadan hallediliyor, yani eleştirilerin yersiz.

    YanıtlaSil
  2. bilakis 3 senedir netbeans kullanıyorum. benim yazıda bahsettiğim arayüzü elle yazmak. o zaman swing adamı çıldırtabiliyor

    YanıtlaSil
  3. S.a ustam qt jambi hakkında yeni yeni bilgi topluyorum allah razı olsun.

    YanıtlaSil
  4. senden de Allah razı olsun hocam. işine yaradıysa ne mutlu bana. Kolay Gelsin

    YanıtlaSil
  5. 10 numara anlatım olmuş. Çok teşekkürler.

    YanıtlaSil
  6. teşekkürler, java ile birarayüz tasarlamam gerekiyo ve swing ile yapılan arayüzçok çirkin :/ javadan da vazgeçmek istemiyorum aradım taradım Qt yi buldum :) yazıda faydalı oldu kolay gelsin

    YanıtlaSil
  7. işenize yaramasina sevindim. ben teşekkür ederim :)

    YanıtlaSil