14 Eylül 2010 Salı

Qt ile basit bir video player yapımı

Herkese merhaba. Bu bölümde yanda gördüğünüz gibi basit bir video player yapacağız. Bu iş için Qt'un hemen hemen her türlü multimedia işleri için kullandığı Phonon frameworkünü kullanacağız.(Ayrıntılar için bakınız ).

Kısaca yazacağımız programdan bahsedeyim. Yazacağımız program sadece 3 işi yapacak. Video'yu oynatacak, duraklatacak ve durduracak. Bu işler için kabaca 3 button ve phonon frameworkü ile gelen 1 videoplayer widget'ı kullanacağız.

Programı yazmaya başlamadan önce Phonon frameworkünü kullanabilmek için "pro" uzantılı dosyamıza şu satırı ekliyoruz


QT +=phonon



İsterseniz şimdi programı yazmaya başlayalım.


#include <QtGui>

/*Ben Pardus işletim sistemi kullandığım için
Phonon kütüphanesi KDE'nin altında bulunuyor
sizinki farklı olabilir. Genelde diğer sistemlerde
sadece #include <Phonon/VideoPlayer> yeterli oluyor*/

#include <KDE/Phonon/VideoPlayer>

using namespace Phonon;

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

//videoplayer ve buttonların
//üzerinde bulunacağı widget
QWidget *parent = new QWidget();

//Burada kullanacağımız Phonon VideoPlayer nesnesini tanımlıyoruz
VideoPlayer *video = new VideoPlayer(parent);

//İzleyeceğimiz videonun yerini tanımlıyoruz.
video->load(QString("/home/mehmet/video.mpg"));

//başlat butonu
QPushButton *play = new QPushButton(parent);
play->setText("play");
play->connect(play,SIGNAL(clicked()),video,SLOT(play()));
//duraklat butonu
QPushButton *pause = new QPushButton(parent);
pause->setText("pause");
pause->connect(pause,SIGNAL(clicked()),video,SLOT(pause()));
//durdur butonu
QPushButton *stop = new QPushButton(parent);
stop->setText("stop");
stop->connect(stop,SIGNAL(clicked()),video,SLOT(stop()));

//widgetların düzgün gözükmesi için
//dikey yerleşim kullanıyorum
QVBoxLayout * vlayout = new QVBoxLayout(parent);

vlayout->addWidget(video);
vlayout->addWidget(play);
vlayout->addWidget(pause);
vlayout->addWidget(stop);

parent->setLayout(vlayout);
parent->setMinimumSize(300,300);
parent->setWindowTitle("Video Player");

parent->show();

return a.exec();
}


Artık sizinde kendinize ait video playerınız var :)

12 Ağustos 2010 Perşembe

KDE 4.5 duyuruldu

Unix ve Unix benzeri işletim sistemleri için geliştirilmiş bir masaüstü ortamı olan KDE'nin (K Desktop Environment - K Masaüstü Ortamı) 4.5 sürümü 10 Ağustos 2010 tarihinde http://www.kde.org sitesinde duyuruldu.
KDE ekibi, yeni sürümü; KDE geliştirme platformu, Plasma masaüstü-Netbook çalışma alanı ve KDE uygulamaları adı altında 3 farklı kategoride duyurdu.

Yeni sürüm ile karşımıza çıkacak bazı özellikler ise şöyle:

1-)Performans artışı ve daha kararlı bir ortam.
2-)KSharedDataCache'de yapılan iyileştirmelerle diskteki veriye daha hızlı ulaşım.
3-)Network ayarları, Plasma-storage ve bir çok Konqueror uygulamasına entegre edilebilen yeni KDE WebKit kütüphanesi
4-)Kullanılabilirlikte bir çok düzeltmenin yapıldığı bir Plasma masaüstü.
5-)Bir çok ilave özelliğin eklendiği ve kullanılabilirlik açısından geliştirilmiş KDE uygulamaları.

KDE 4.5 hakkında daha detaylı bilgi edinmek için burayı ziyaret edebilirsiniz.

11 Temmuz 2010 Pazar

Bir Pardus stajyerinin proje seçme hikayesi

Stajın 3. gününde eğitimler tamamlanmış, önümüze seçmemiz için 12 tane proje sunulmuştu. Karar vermek için bir gün süremiz vardı. Vakit kaybetmeden projeleri incelemeye başladım. Gözlerim 12 numaralı projede takıldı . 12 numarada, ncurses ya da farklı bir kütüphane kullanılarak, Pardus için yeni bir kurtarma modunun yazılması isteniyordu. Kısacası X-Window kullanmayan hızlı yüklenen ve hızlı çalışan bir kurtarma modu. Biraz düşündükten sonra içimden bir ses "kafama yattı yani hoşuma gitti" dedi. Böylece kararımı vermiş oldum 12 numaralı projeyi isteyecektim.

Ertesi gün geliştiricilerle yapılan toplantıda bu kararımı açıkladım. Şansıma bu projeyi benden başka isteyen çıkmamıştı. Detaylar hakkında bilgi de aldıktan sonra istediğim projeye kavuşmuş, mutlu bir insan olarak toplantıdan ayrıldım.

8 Temmuz 2010 Perşembe

Pardus'ta staj

Öncelikle Linux ile nasıl tanıştığımı sizlere anlatayım. Linux maceram 2002 yılında Byte dergisinin verdiği Mandrake 9.0 Doplhin CD'sini elime almamla başladı. O zamanlar tek bildiğimiz işletim sistemi Microsoft Windows'tu haliyle. CD Kapağındaki penguen resmi yüzünden oyun zannettiğim Mandrake Linux'ü, Windows'a kurmaya kalktığımda, exe dosyalarını göremeyince telaşa kapıldım. Kendi kendime "bu ne olaki böyle" dedikten sonra CD'nin gizemini çözmeye çalıştım.

CD'nin gizemini çözdüğümde "Ya bu Linux ne yararlı bir şeymiş" dedim kendi kendime ve bu konuyu daha yoğun araştırmaya başladım. Sonunda ülkemizin yazılım sektöründeki dışa bağımlığının ortadan kalkmasının tek yolunun özgür yazılımdan geçtiğine karar verdim. Tabi o zamanlar bunun pek mümkün olacağını düşünmüyordum. 2004 yıllında TÜBİTAK'ın Pardus projesini başlattığını duyunca tünelin ucunda bir ışık görmeye başladım. Şimdi de tünelin ucundaki ışığın şiddetini biraz daha arttırabilmek için çok isteyerek başvurduğum Pardus stajında görev yapmaktayım.

Yazımın bundan sonraki kısmında, staja başlamadan önce kafama takılan soruları kendime sorup cevaplayacağım. Umarım sizin kafanıza takılan sorulara da cevap vermiş olurum.

soru: TÜBİTAK-UEKAE yerleşkesi Gebze'de. Ulaşımı nasıl sağlayacağız?
cevap: TÜBİTAK'ın bu konuda hakkını vermek lazım. Eğer İstanbul'da oturuyorsanız eminin olun evinizin yakınlarında bir yerden servis geçiyordur. Buradan servis güzergahlarını inceleyebilirsiniz. Şehir dışından gelen arkadaşlar içinde misafirhaneler bulunmakta ama siz misafirhane işine pek güvenmeyin kalacak yerinizi kendiniz ayarlamaya çalışın.

soru: Çalışma günleri ve saatleri nelerdir ?
cevap: TÜBİTAK-UEKAE Pardus ekibi hafta içi her gün saat 8:00 - 17:00 arasında çalışmaktadır.

soru: Yemek olayını nasıl yapacağız ?
cevap: Kahvaltıyı evinizde yapabilirsiniz :) olmadı UEKAE binasının içinde bulunan kantinden benim yaptığım gibi sandviç - portakal suyu ikilisini deneyebilirsiniz :P . Öğle yemeği saat 12:00 - 13:00 arasında, yemekhaneden stajyerlere ücretsiz olarak verilmektedir.

soru: Çalışma ortamı nasıl ?
cevap: Çalışma ortamı bana göre gayet iyi. Stajyerlere özel (klimalı, modern :) ) ofisler ve (her başına oturduğumda eve götüresim gelen intel quard işlemcili 22 inch lcd monitörlü) bilgisayarlar veridi. Pardus çalışanları da güler yüzlü ve yardım severler. Özellikle buradan her yarım saatte bir yanına soru sormaya gittiğim ve her soruma sağ olsunlar bıkmadan cevap veren Ozan ve Renan beye teşekkür ediyorum :) Ayrıca ilk 3 gün stajyerlerin çalışma ortamına hızla ayak uydurabilmesi için eğitimler veriliyor. 3 gün sonunda çalışma sistemini öğrenmiş ve "hadi artık bilgisayarımı verin bana" moduna giriyorsunuz :)

soru: Kimin hangi projeyi yapacağı nasıl belirleniyor?
cevap: Projeler, stajyerlere bir liste halinde veriliyor. Stajyerler de kendilerine uygun olan projeleri belirliyorlar. Daha sonra hep beraber bir toplantı yapılıyor. Toplantıda stajyerler seçtikleri projelerle ilgili kafalarına takılanları geliştiricilere soruyorlar, sonunda herkes yapabileceğini düşündüğü projeyi seçiyor.

soru: Python bilmek zorunda mıyım ?
cevap: Staja başlamadan önce Python'u bilmiyordum ve hakkında da pek iyi düşüncelerim yoktu. Aklımda projemi C/C++ ile yapmak vardı. Danışmanın Ozan bey Python'u kullanmamın bana kolaylık sağlayacağını söylendi. "Ben Python'u bilmiyorum nasıl yapacağım ?" diye sorduğumda, 1 günde öğrenirsin ne var ki diye bir karşılık aldım :) Gerçekten de dediği gibi Python 1 günde öğrenilebilen ve hemen hemen her şeyde kolaylık sağlayan bir dilmiş. Şu an projemi Python ile geliştiriyorum ve bitirmek üzereyim :)

soru: Aklıma soracak soru gelmedi. Senin söylemek istediğin bir şeyler var mı ?
cevap: Bundan önce ki stajımı yine önemli bir yerde yapmıştım ve bana ne yararı oldu diye sorarsanız genel kültür dışında hiç bir yarı olmadı. Şu anda cennette gibiyim. Tam anlamıyla verimli bir yazılım stajı geçirmekteyim. TÜBİTAK'ın sunduğu olanakların dışında, stajyerlerine, "stajyerlere 1 ay boyunca katlanacağız artık" zihniyeti ile değil bu arkadaşlar da artık bizim çalışanlarımız düşüncesiyle hareket eden bir ekibin için 1 ay da olsa çalışmaktan çok mutluyum.

Yazımı burada bitiriyorum. Sizin de aklınıza stajla ilgili takılan sorular olursa çekinmeden sorabilirsiniz. Sorularınızı elimden geldiğince cevaplamaya çalışacağım.

Herkese iyi çalışmalar. Görüşmek üzere.

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.

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