30 Mart 2010 Salı

Arayüz Programlama::Bölüm 1:"Merhaba QT GUI"

Daha önceki yazılarımı incelediyseniz yazdığım Qt programlarının hepsi konsol uygulamara yönelikti. Artık Qt ile
belli bir seviyeye geldiğimizi düşünüyorum. Bundan sonra konsol uygulamalar ile birlikte her zaman olduğu gibi basit kodlarla Qt GUI
ile ilgili örnekler yapacağım. Daha önce yazdığımız konsol programlarla basit bir notpad'i yapabileceğimiz düşüncesindeyim tek yapmamız gereken bir arayüz hazırlamak o kadar.
Bu yüzden ilk hedefim Qt ile basit bir notpad uygulaması yazmak olacak. Şimdi yavaş yavaş notpad'i yapmak için kullanacağımız araç gereci öğrenmeye başlayalım.

İşe geleneksel "Merhaba" programı ile başlayalım.



// GUI programlada uygulama kontrol akışlarını ve ana ayarların yönetildiği sınıf
#include <QApplication>
#include <QLabel> // Etiket

int main(int argc, char *argv[])
{
QApplication a(argc, argv); //QApplication nesnemizi oluşturuyoruz.

QLabel etiket("Merhaba Qt GUI"); //QLabel nesnemizi oluşturuyoruz

etiket.show();//etiket adlı nesnemize gösterme koyuyoruz

return a.exec();// Burda da QApplication nesnemizi çalıştırıyoruz.
}



Programı derleyip çalıştırdığınızda şöyle bir programla karşılaşacaksınız.




Detaylı QApplication bilgisi için: http://doc.trolltech.com/4.5/qapplication.html
Detaylı QLabel bilgisi için: http://doc.trolltech.com/4.5/qlabel.html

Konsol Programlama::Bölüm 7:"QDir ile belirtilen dizinin içeriğini görme"

Basit konsol programlama 6. bölümde QFile ile basit olarak bir dosyaya nasıl yazılır ve okunur
öğrendik. Şimdi QDir ile dizin işlemleri nasıl yapılır bunlara göz atalım. Bu programımıda bizim belirtiğimiz bir dizinin içeriğini ekrana basacağız. Programın kodları şu şekilde.



#include <QDir>
#include <QTextStream>
#include <QStringList>

QTextStream yaz(stdout,QIODevice::WriteOnly);

int main()
{
QDir dizin; //QDir nesnemizi oluşturduk.

//nesnemisin yolunu belirledik.Bu kısmı windows kullananlar c: yapabilirler
dizin.setPath("/");

//Toplam dizin sayısını yazdırıyoruz
yaz << "Toplam " << dizin.count() << " dizin var. Bunlar:" << endl;

//Qdir nesnemizin entryList() methodunu çağırarak dizin
//isimlerimizi QStringListIterator nesnemize yerleştiriyoruz
QStringListIterator iter (dizin.entryList());

//Dizim isimlerini ekrana basıyoruz
while(iter.hasNext())
yaz << iter.next() << endl;

return 0;
}



Programı çalıştıranlar Linux kullanıyorlarsa şu şekilde bir çıktı alacaklar



Toplam 20 dizin var. Bunlar:
.
..
bin
boot
dev
etc
home
lib
lost+found
media
mnt
opt
proc
root
sbin
swap
sys
tmp
usr
var




Detaylı QDir bilgisi için: http://doc.trolltech.com/4.5/qdir.html

29 Mart 2010 Pazartesi

Eclipse ve Qt

Sözü fazla uzatmayacağım. Daha önce Qt projelerimi Qt Creator'da geliştirdiğimi söylemiştim. Eğer siz Qt Creator bana göre değil
ben Eclipse'ciyim diyorsanız Eclipse'nizden vazgeçmenize gerek yok. Plugin mantığı ile çalışan Eclipse bir plugin de Qt geliştirmiş.
Böylece Eclipse içerisinde Qt dizaynları kolayca hazırlayabileceksiniz.
Öncelikle http://qt.nokia.com/developer/eclipse-integration bu adresten size uygun olan Eclipse pluginini seçin. Ben Pardus 2009.1 kullandığım için Linux (x86 32 bit)
sürümü için olanın indiriyorum.
Daha sonra windows kullanıyorsanız exe dosyasını çalıştırın eğer benim gibi Linux kullanıyorsanız indirdiğiniz sıkıştırılmış dosyayı açın ve içerisinden çıkan klasörü
sistemde Eclipse'in bulunduğu dizine kopyalayın. Pardus'ta bu dizin /opt de bulunuyor. Tüm bu işlemleri bitirdiğinizde artık Eclipse'niz Qt'lu olacaktır. Afiyetle kullanın.



Not: Bu arada benim gibi sizde Netbeans'ciyseniz Netbeans 7'den itibaren bizler de Qt formlarımızı Netbeans ile geliştirebiliceğiz.

22 Mart 2010 Pazartesi

Konsol Pogramlama::Bölüm 6:"QFile ile text dosyasını okumak"

Bu yazıda Qt ile bir text dosyası nasıl okunur onu öğreneceğiz.
Yazacağımız programın mantığı Konsol Programlama::Bölüm 5'de anlatılan matıkla aynı.

Şimdi de programımıza göz atalım



#include <QTextStream>
#include <QString>
#include <QFile> // Dosya işlemleri için kullanacağımız kütüphane

QTextStream yaz(stdout,QIODevice::WriteOnly);
QTextStream oku(stdin, QIODevice::ReadOnly);

int main()
{
QString yazilacak="Merhaba \nbu \nQFile \nile \nikinci \nProgramım";

QFile dosya("metin.txt"); //Dosyaya adını giriyoruz

dosya.open(QIODevice::WriteOnly); //Dosyayı yazma modunda açıyoruz.
//Bu modda programı her çalıştırdığımızda dosya
//baştan oluşturucaktır

QTextStream dosyaIO(&dosya);//input output işlemi için QTextStream'i kullanacağız
//bu yüzden QTextStream nesnemize dosya'nın adresini giriyoruz.


dosyaIO << yazilacak; //Burada dosyaya yazdırıyoruz

dosya.close(); //Dosyayı kapatıyoruz.(Açılan her dosya kapatılmalıdır.)

dosya.open(QIODevice::ReadOnly); //Yazdırdığımız dosyayı okuma modunda tekrar açıyoruz

while(!dosyaIO.atEnd()) //Dosyayının sonuna gelene kadar döndür.
{
yaz << dosyaIO.readLine() << endl; //Okuduğunan satırı dosyaya yazdır.
}

dosya.close(); //Dosyayı kapatıyoruz.

return 0;
}




Programı çalıştırdığınızda aşağıdaki sonucu elde edeceksiniz




Merhaba
bu
QFile
ile
ikinci
Programm



Detaylı QFile bilgisi için: http://doc.trolltech.com/4.5/qfile.html

20 Mart 2010 Cumartesi

Konsol Pogramlama::Bölüm 5:"QFile ile text dosyasına yazma"

Qt'da dosya okuma yazma işlemleri QFile sınıfını kullanarak yapılır. Bu yazıda Qt ile bir text dosyası nasıl oluşturulur onu öğreneceğiz.
Yazacağımız programın mantığı şu şekilde olacak;

1-)Dosya tanımlanacak
2-)Dosya açılış şekli belirtilerek açılacak. (okuma, yazma, okuma-yazma gibi biz bu programda sadece yazma kullanacağız)
3-)Dosya giriş çıkış işlemleri için bir nesne oluşturulacak. (Bu nesne text üzerinde çalışacağımız içim QTextStream olacak)
4-)Klavyeden gelen metin dosyaya yazdırılacak.
5-)Dosya kapatılacak.

Şimdi de programımıza göz atalım



#include <QTextStream>
#include <QString>
#include <QFile> // Dosya işlemleri için kullanacağımız kütüphane

QTextStream yaz(stdout,QIODevice::WriteOnly);
QTextStream oku(stdin, QIODevice::ReadOnly);

int main()
{
QString yazilacak;

QFile dosya("metin.txt"); //Dosyaya adını giriyoruz

dosya.open(QIODevice::WriteOnly); //Dosyayı yazma modunda açıyoruz.
//Bu modda programı her çalıştırdığımızda dosya
//baştan oluşturucaktır

QTextStream dosyaYaz(&dosya);//input output işlemi için QTextStream'i kullanacağız
//bu yüzden QTextStream nesnemize dosya'nın adresini giriyoruz.

yaz << "Dosya yazmak istediginizi girin" << endl;

yazilacak=oku.readLine();//klavyeden girilen yazıyı okuyoruz

dosyaYaz << yazilacak; //Burada dosyaya yazdırıyoruz

dosya.close(); //Dosyayı kapatıyoruz.(Açılan her dosya kapatılmalıdır.)

return 0;
}



Programı çalıştırdığınızda aşağıdaki sonucu elde edeceksiniz



Dosya yazmak istediginizi girin
Merhaba QFile
Merhaba QFile



Aynı zamanda programı çalıştırdığınız dizine baktığınızda "metin.txt" adlı bir dosya oluştuğunu göreceksiniz.Bu dosyanın içini açtığınızda da "Merhaba QFile" yazı sizi bekliyor olacak.

Detaylı QFile bilgisi için: http://doc.trolltech.com/4.5/qfile.html

17 Mart 2010 Çarşamba

Konsol Programlama::Bölüm 4:"QTextStream ile konsol giriş çıkışı"

Stream'ler okuma ve yazma yapabilmek için kullanılan nesnelerdir.Standart C++'da bu işlemleri
yapabilmek için < iostream > kütüphanesi kullanılmaktadır. Qt'da bu kütüphanenin karşılığı
QTextStream kütüphanesidir.

iostream'de 3 tane global stream tanımlıdır
1-)cin : standart input(klavye)
2-)cout: standart output(konsol ekranı)
3-)cerr: stadnart hata-error (konsol ekranı)

QTextStream'i nesnelerini tanımladıktan sonra kullanım şekli C++'ın standart giriş, çıkış nesneleri ile aynıdır.
QTextStream nesneleri, QTextStream nesne_adı(stream yapılacak yer, kullanım türü) şeklindedir. Buna göre
standart C++ giriş çıkışlarına tam karşılık düşen nesnelerin tanımlanması şu şekildedir.



QTextStream cin(stdin, QIODevice::ReadOnly); // stdin klavye girişi, kullanım türü sadece okuma
QTextStream cout(stdout, QIODevice::WriteOnly);//stdout konsol çıkışı, kullanım türü sadece yazma
QTextStream cerr(stderr, QIODevice::WriteOnly);//stderr konsol çıkışı, kullanım türü sadece yazma



Qt ile konsol programlamada konsol giriş çıkışı için iostream kütüphanesi yerine QTextStream kütüphanesi kullanmamızın nedeni Qt değişkenlerinin (QString gibi) QTextStream çok rahat kullanılabilmesidir.

Örnek vermek gerekirse

iostream kütüphanesini kullansaydık şöyle olacaktı



QString a = "iostream kullanıyorum";
cout << a.toAscii().constData(); // Bir QString'i yazdırmak için 2 tane fonksiyon çağırmak zorunda
// kaldık ancak QTextStream'de böyle fonksiyon çağırmaya gerek yok.



Detaylı QTextStream bilgisi için: http://doc.trolltech.com/4.5/qtextstream.html

15 Mart 2010 Pazartesi

Konsol Programlama::Bölüm 3: "Basit QMap uygulaması"

QMap bir şablon sınıfıdır. Atlamalı liste tabanlı bir sözlük oluşturmamızı sağlar.QMap Qt frameworkünde kullanılan genel bir konteyner sınıftır. QMap'de veriler < Anahtar,Veri > şeklindedir ve QMap anahtarlar üzerinden hızlıca veriye ulaşmamızı sağlar.QMap'in performans bakımından gelişmiş hali QHash'dir. Ancak ona sonra değineceğiz.

Şimdi programımıza bir göz atalım



#include <QTextStream>
#include <QString>
#include <QMap>


/*Tüm fonksiyonların kullanabilmesi için
yaz ve oku nesnelerini global yapıyorum.
*/

QTextStream yaz(stdout), oku(stdin);
//oku nesnesi klavyeden gelen (stdin) girişi almaktadır.

int main()
{

QMap<QString,QString> kullanicilar; //kullanicilar adındaki < QString,QString >
// formatindaki QMap nesnemizi tanımladık

//Kullanıcı adı anahtar, sifrede veri olacak.
kullanicilar.insert("Cengiz","abc111"); // Değerleri giriyoruz
kullanicilar.insert("Burak","abc123");
kullanicilar["Ali"]="123abc"; // Değerleri bu şekilde de girebilirsiniz.


QString kullaniciAdi;
QString sifre;

yaz << "Kullanici adini girin:" << endl;
oku >> kullaniciAdi;
yaz << "Sifrenizi girin:" << endl;
oku >> sifre;

if(sifre.length()<5) // girlen şifrenin karakter sayısı kontrol ediliyor
{
yaz << "Sifre 5 karakterden kucuk olamaz" << endl;
return 0;// programdan çık
}

if(kullanicilar.contains(kullaniciAdi)) // girilen isimde kullanıcı var mı kontrol ediliyor.
{
if(kullanicilar.value(kullaniciAdi)==sifre) // şifrenin doğruluğu kontrol ediliyor
{
QString dolgu; // Süsleme işlerinde kullanacağız
yaz << "Hosgeldiniz.\nSistemde kayitli olan kullanicilar ve sifreleri:\n" << endl;

// STL tipi bir iterator tanımladık
// ve kullanicilar nesnemizin ilk elemanını işaret ettik
QMap<QString, QString>::const_iterator i = kullanicilar.constBegin();

//QString'in bize sağladığı fonksiyonları kullanarak süslü bir başlık oluşturuyoruz
yaz << QString("Kullanici Adi").rightJustified(15,' ')+" | "+
QString("Sifre").rightJustified(15,' ') << endl;

yaz << dolgu.fill('-',15)+" | "+dolgu.fill('-',15) << endl;

//kullanicilar nesnemizdeki verileri listeliyoruz.
while (i != kullanicilar.constEnd())
{
yaz << i.key().rightJustified(15,' ') + " | " +
i.value().rightJustified(15,' ') << endl;
++i;
}
yaz << endl;
}
else
{
yaz << "Hatali sifre" << endl;
return 0; // programdan çık
}
}
else
{
yaz<< "Boyle bir kullanici yok" << endl;
return 0; // programdan çık
}

return 0; // programdan çık
}



Burada dikkat ettiyseniz QString nesnelerinde == operatörü ile büyük küçük harfe duyarlı karşılaştırma yapabiliyoruz.

QMap::key() fonksiyonu bize anahtarı, QMap::value() fonksiyonu da bize veriyi döndürmektedir. Bu fonksiyonları key(veri) -> anahtar, value(anahtar) -> veri şeklinde de kullanabiliriz.

Program çalıştığında elde edeceğimiz sonuç şu şekide olacaktır.



Kullanici adini girin:
Burak
Sifrenizi girin:
abc123
Hosgeldiniz.
Sistemde kayitli olan kullanicilar ve sifreleri:

Kullanici Adi | Sifre
--------------- | ---------------
Ali | 123abc
Burak | abc123
Cengiz | abc111




Burada anahtarların sıralı bir şekilde geldiğini rahat bir şekilde görüyoruz.

Detaylı QMap bilgisi için: http://doc.trolltech.com/4.5/qmap.html
Detaylı QString bilgisi için: http://doc.trolltech.com/4.5/qstring.html

Konsol Programlama::Bölüm 2: "İki sayının toplamı"

Bu programda klavyeden girilen iki sayı toplayıp sonucu ekrana yazdıracağız. Öncelikle Qt-Creator'dan bir “Qt 4 Console Application” açıyoruz. Ben Pardus işletim sistemini kullanmaktayım. Pisi paket yöneticisinden kurduğum Qt-Creator varsayılan olarak “xterm” uç birimini kullanmakta. Bunu Kde'nin varsayılan uç birim aracı “Konsole” ile değiştirmeye çalıştım ancak başarılı olamadım. İnternette yaptığım araştırma sonucunda da Qt-Creator ile Konsole'un birlikte çalışamadığını öğrendim. Bu yüzden başka bir çözüm bulana kadar xterm ile idare edeceğiz. Eğer sisteminizde xterm yüklü değilse Pardus kullanıcıları programı şu şekilde sistemlerine kurabilirler


$sudo pisi it xterm


Eğer Qt-Creator'da konsol projesini açtıysanız şimdi yazdığımız programı xterm ile çalıştırabilmemiz için küçük bir ayar yapmamız gerekiyor. Projects->Run Settings bölümüne gelin buradaki Run in a Terminal'li işaretleyin hepsi bu kadar.

Sıra programımızı yazmaya geldi.



#include <QTextStream>

/*Tüm fonksiyonların kullanabilmesi için
yaz ve oku nesnelerini global yapıyorum.
*/

QTextStream yaz(stdout), oku(stdin);
//oku nesnesi klavyeden gelen (stdin) girişi almaktadır.

int main()
{
qint16 sayi1; //qint16 tüm platformlarda
qint16 sayi2; //16 bitlik (2 byte) interger alanını
qint16 sonuc; //bize garanti eder.

yaz << "1. Sayiyi girin" << endl;

oku >> sayi1; //klavyeden gelen değeri sayi1'e yaz

yaz << "2. Sayiyi girin" << endl;

oku >> sayi2; //klavyeden gelen değeri sayi2'e yaz

sonuc = sayi1 + sayi2;

yaz << "iki sayinin toplami = " << sonuc << endl;

return 0;
}



Program çıktısı şu şekilde olacak:


1. Sayisi girin:
12
2. Sayiyi girin:
13
iki sayinin toplami = 25



Not: Eğer biraz kurcaladıysanız xterm'de türkçe karakter sorunun olduğunu fark etmişsinizdir. Bu durumun çözümünü internette araştırıyorum. Eğer siz benden önce bulursanız lütfen bana da haber verin :)

14 Mart 2010 Pazar

Konsol Programlama::Bölüm 1: " Merhaba Dünya"

Şimdi bir programlama dilini öğrenmek isteyen herkesin ilk olarak yazdığı programı yazacağız.

Öncelikle bu programın sadece C++ kullanarak nasıl yazılacağına bakalım.


#include <<iostream>
#include <string>

using namespace std;

int main()
{
string s;

s="Merhaba Merhaba";

cout << s << endl;

return 0;
}


Şimdi de bu işlemi Qt framework kullanarak yapalım. Öncelikle Qt-Creator'la Qt 4 Console Applicaton açalım. Sonra açılan main.cpp dosyasına aşağıdaki kodu yazalım.


#include <QTextStream> // Ekrana yazı basmak için kullanacağız
#include <QString> //Qt'un string kütüphanesi

QTextStream yaz(stdout); // Çıkışı konsol ekranı (stdout) olan
// yaz adında QTextStream nesnesi oluşturduk.

int main()
{
QString s ="Merhaba Dünya";

yaz << s+" Bu benim ilk Qt'lu programım" << endl; // ekrana yazdır.

return 0;
}


Qt'da sizinde fark ettiğiniz gibi Qt frameworkünün nesneleri 'Q' ile başlamaktadır. Programı çalıştırdığınızda şu sonucu elde edeceksiniz.


Merhaba Dünya Bu benim ilk Qt'lu programım

Qt Creator IDE

Qt \ C++ ile program geliştirmek için herhangi bir text editörü yeterlidir ancak hızlı kod geliştirmek için bir IDE (Integrated development environment - Tümleşik geliştirme ortamı ) kullanmak mantıklı olacaktır. Qt \ C++ programlar geliştirmek için piyasada bir çok farklı IDE bulunmaktadır. Ben IDE olarak Nokia'nın geliştirdiği Qt Creator'ı kullanıyorum. Qt Creator'ı sadeliği ve GUI tasarımında sağladığı kolaylık sebebiyle tercih etmekteyim.


Qt Creator'un Linux, MacOS ve Windows sürümleri mevcut. Qt Creator'u ücretsiz olarak http://qt.nokia.com/downloads adresinden indirebilirsiniz.

Eğer sizde benim gibi Pardus işletim sistemi kullanıyorsanız;

$sudo pisi it qt-creator

komutu ile Qt Creator'u kolayca kurabilirsiniz.

Kısaca Qt nedir ?

Qt (küut diye okunur) , cross-platform (tüm platformlarda çalışabilen) projeler geliştirmek için kullanılan bir frameworkdür (iskelet) . Genel olarak GUI (Graphic User Interface – Grafiksel Kullanıcı Arayüzü) amaçlı kullanılır ancak terminal programları ve sunucular gibi grafiksel arayüzü olmayan programları geliştirmek için de kullanılabilmektedir.

Qt, standart C++ programlama dilini kullanmaktadır. Aynı zamanda Qt farklı dillere olan bağlantıları aracılığıyla diğer programlama dilleriyle de kullanılabilmektedir. Qt'un GUI özelliğine ek olarak; SQL veri tabanlarına bağlanabilme, XML çözümleyebilme, Thread (iş parçacığı) yönetimi, network desteği ve tüm platfromlarla bütünleşik dosya işleme API'si (Application Programming Interface - Yazılım Programlama Arayüzü) gibi özelliklerikleri de vardır.

Qt Nokia tarafından geliştirilmektedir. Nokia, Qt'u 4.5 sürümünden sonra LGPL ve ticari lisans olmak üzere iki ayrı lisansla dağıtmaktadır.

Qt'un resmi web sitesi : http://qt.nokia.com/

Qt'un framework'ünü yada SDK'ını indirmek için : http://qt.nokia.com/downloads