25 Nisan 2010 Pazar

Arayüz Programlama::Bölüm 3:"SIGNAL ve SLOT"

SIGNAL ve SLOT iki nesneni bir birleri ile iletişim kurmasına yararlar. SIGNAL ve SLOT mekanizması Qt'un en önemli özelliklerinden biridir.Arayüz (GUI) programlamada, bir widgetta bir değişiklik olduğunda diğer widget tarafından fark etdilmesini isteriz yaninesneleri bir birleri ile iletişim kurmasını isteriz. Örneğin kullanıcı kapat düğmesine bastığında pencerenin kapanması gibi.

Eski toolkitlerde bu durum callback (geri çağrı) kullanarak çözülmüştür.Callback bir fonksiyonu işaret eder. Çalışan bir fonksiyona bir durumu bildirmek istiyorsak kullanacağımız fonksiyonu çalışan fonksiyona işaret ederiz.Çalışan fonksiyonda uygun olduğu zaman işaret ettiğimiz fonksiyonu çalıştırmaya başlar.Ancak bu yöntemin çalışan fonksiyonun, işaret ettiğimiz fonksiyonu doğru argümanlarla çalıştıracağını bilemememiz gibi sorunları vardır yani bu yöntem type-safe değildir.

Qt'da callback tekniğine alternatif olarak SIGNAL ve SLOT'lar kullanılmaktadır. SIGNAL bir durum oluştuğundan yayılmaya başlar.SLOT da SIGNAL çağrılarına cevap veren fonksiyonlardır. SIGNAL-SLOT meknizması type-safe'dir.SIGNAL'ın imzası SLOT'un imzası ile eşleşmelidir.Bu konuda derleyici eşleşmeyen imzaları tespit ederek bize yardım etmektedir.Qt widgetlarında bir çok tanımlanmış SIGNAL ve SLOT mevcuttur.Gerektiğinde programcıda kendi SIGNAL ve SLOT'unu yazabilektedir.SIGNAL ve SLOT'lar bir birleri ile QObject sınıfının connect methodu kullanılarak ilişkilendirilir.

Şimdi SIGNAL ve SLOT'u basit bir örnekle daha iyi anlmaya çalışalım. Yapıcağımız örnekte 2 tane widget ve bu widgetların hazır SIGNAL ve SLOT'larını kullanacağız. Yazacağımız program şöyle olacak 1 tane QLabel ve 1 tanede QPushButton nesnesi oluşturacağız. Program şu işi yapacak; QPushButton nesnesine tıklandığında bu nesne sinyal yaymaya başlıyacak ve QLabel nesnesi bu sinyali alıp kendinin kapatma slotunu çalıştıracak ve QLabel nesnesi kapanacak.







#include <QtGui>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);

QPushButton nesne1("QPushButton");
QLabel nesne2("QLabel");

QObject::connect(&nesne1,SIGNAL(clicked()),&nesne2,SLOT(close()));

nesne1.show();
nesne2.show();

return a.exec();
}




24 Nisan 2010 Cumartesi

Arayüz Programlama::Bölüm 2:"QWidget ve Layout kavramı"

Bu bölümde QWidget ve Layout kavramını ele alacağız. Qt'daki tüm arayüz sınıfları QWidget'tan türetilmiştir. Yani QWidget'a Qt arayüz sınıflarının atasıdır diyebiliriz.



QWidget mouse, klavye ve diğer input değişkenlerinden gelen bilgileri toplar ve istenen görüntüyü ekrana çizer.Tüm widgetlar kare şeklindedir.Bir widget diğer bir widgetın içine gömülebilir eğer gömülmezse pencere oluşturur.Genelde pencere bir çerçeve ve başlık çubuğundan oluşur.Pencere olarak sadece QWidget kullanılabileceği gibi Qt'de bulunan QMainWindow ve QDialog gibi (alt sınıf) hazır pencereler de kullanılabilir. Bu bölümde de sadece QWidget kullanarak bir pencere oluşturacağız.

Bir widgetın diğer bir widgeta gömülebilebileceğini söylemiştim. Bu göme işlemleri layoutlar kullanılarak yapılabilmektedir.Layout sınıfları widgetları görsel olarak düzenlemeye yarayan sınıflardır.

Şimdi yazacağımız programın yapısını görsel olarak inceleyelim.



Şimdi de programın nasıl yazılabileceğine bakalım.




#include <QtGui>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);

QWidget pencere;

pencere.setWindowTitle("Merhaba Qt");


QLabel etiket("QLabel");
QPushButton dugme("QPushButton");


QGridLayout izgara;

izgara.addWidget(&etiket,0,0);
izgara.addWidget(&dugme,0,1);

pencere.setLayout(&izgara);

pencere.show();

return a.exec();
}





Burda layout olarak Grid (ızgara) layoutunu kullandık. Bu layoutda widgetler satır ve sütunlara yerleştirilmektedir. Yerleştirme işlemi addWidget methodu kullanılarak yapılabilmektedir.

addWidget(widget adresi,satır,sütun)

Yerleştirme yapılırken dikkat edilmesi gereken husuz satır ve sütunlar 0 dan başlamaktadır. Programı çalıştırdığınızda şöyle bir ekranla karşılacaksınız.