You are on page 1of 5

QT Eitimi - 2 :Yerleim (Layout)

nder Arslan <onder@xcoders.net>


Srm 1.0

zet Bu belge qt renimi iin bir dizi eklinde hazrlanmtr. C++ bilmek n kouldur. Giri QT eitimine yerleim (layout) 'lerle devam ediyoruz. Aslnda bunu anlatmann sanrm en kolay yolu be-on tane QPushButton oluturup bunlar bir ekilde yerletirmek olmal ama biz her zaman olduu gibi zor yolu seeceiz. Her rnekte biraz daha fazla kontrol kullanp bunlarn da birka zelliini renmek ufkumuzun almasna biraz daha yardmc olucak diye dnyorum. nceki derste kullandm kontroller ve zellikleri konusunda fazla aklama yapmayacam. Anlayamadnz yerde birinci derse dnebilirsiniz. Yerlesim QT4 'te yerlesim (layout) sistemi olduka gl ve kolay. Kontrollerinizi yerletirmek iin kullanabileceiniz tane yerleim snf (layout classes) var : yatay , dikey ve zgara yerleim snflar (horizontal, vertica, grid layout classes). Yine adeti bozmadan snf bildirimimizle balyoruz : /*--- form.h ---*/ #ifndef FORM_H #define FORM_H #include <QtGui> class Form : public QDialog { Q_OBJECT public: QPushButton *btnMesaj; QPushButton *btnAc; QPushButton *btnTemizle; QPushButton *btnCik; QLabel *lblMesaj; QLabel *lblAc; QLabel *lblTemizle; QTextEdit *yazi; QDirModel *model; QTreeView *treeDosyalar;

Form(); public slots: void mesajGoster() { QMessageBox::information(this, "Mesaj", "Layer 'lar o kadar da zor degilmis :)"); } void dosyaAc() { QString dosyaYolu = QFileDialog::getOpenFileName(this); QFile dosya(dosyaYolu); dosya.open(QFile::ReadOnly | QFile::Text); QTextStream ts(&dosya); yazi->setPlainText(ts.readAll()); } void treeAc(const QModelIndex qm) { QDirModel *yol= new QDirModel(); QFile dosya_(yol->filePath(qm)); dosya_.open(QFile::ReadOnly | QFile::Text); QTextStream ts_(&dosya_); yazi->setPlainText(ts_.readAll()); } }; #endif form.h: lk olarak yine balk (header file ) dosyamza include n ilemci komutuyla gerekli modlleri ekliyoruz. QtGui modl qt 'deki grsel kontrolleri barndrd iin "merhaba dnya" rneinde olduu gibi tm kontrolleri tek tek include nilemci komutuyla dahil etmemize gerek kalmyor. Hemen altnda form snfmz tanmlyoruz ve public tretmesi ile QDialog 'dan tretiyoruz. QDialog kullanc arabirimimizin taban diyebiliriz. Kontrollerimizi bunun stnde oluturuyoruz, windows 'ta form, java 'da jframe gibi ;) Hemen altnda Q_OBJECT makromuzu ve yapc fonksiyon (constructer) ile kullancamz kontrollerin bildirimlerini yapyoruz : QPushButton, QLabel, QTextEdit, QTreeView. public slots 'a butonlar tkland zaman ve treeview 'dan bir text dosyas zerinde ift tkland zaman alacak fonksiyonlar tanmlyoruz. mesajGoster() fonksiyonu bir nceki derse gnderme olarak orda : QMessageBox 'n kullanmn unutmadk deil mi? dosyaAc() fonksiyonu btnAc QPushButton 'na tklannca alacak fonksiyon adndan belli olduu gibi bir text dosyas amaya yaryor. Bu fonksiyon iinde QFileDialog kontol yardmyla setiimiz text dosyasn bir QString deikene atyoruz. Daha sonra bu text dosyas iin "dosya" adnda QFile nesnesi oluturuyoruz. QFile snf bize dosyaya yazma ve dosyadan okuma yapabilmemiz iin bir arayz salyor. QFile 'n open fonksiyonuyla dosyamz salt okunur ve text modunda ayoruz. QTextStream nesnesi oluturarak QTextEdit 'in setPlainText fonksiyonu ile alan dosyadaki yazlar grntlyoruz. treeAc(const QModelIndex qm) fonksiyonu 'da dosyaAc() fonksiyonuyla ayn ii yapyor. treeAc fonksiyonu dosyann yol bilgisini dosyaAc fonksiyonundan farkl olarak bir QDirModel nesnesi ile yerel dosya sistemine erierek QTreeView 'de seilen text dosyasnn yolunu QFile nesnesine geiyor. /*--- form.cpp ---*/

#include "form.h" Form::Form() { resize(600,600); QGridLayout *gLayout= new QGridLayout(); lblMesaj = new QLabel("Mesaj goster :"); gLayout->addWidget(lblMesaj,0,0); lblAc = new QLabel("Dosya Ac :"); gLayout->addWidget(lblAc,1,0); lblTemizle = new QLabel("Temizle :"); gLayout->addWidget(lblTemizle,2,0); btnMesaj = new QPushButton("Mesaj Goster"); gLayout->addWidget(btnMesaj,0,1); btnAc = new QPushButton("Dosya Ac"); gLayout->addWidget(btnAc,1,1); btnTemizle = new QPushButton("Temizle"); gLayout->addWidget(btnTemizle,2,1); treeDosyalar = new QTreeView(); model = new QDirModel(); treeDosyalar->setModel(model); gLayout->addWidget(treeDosyalar,0,2,14,1); yazi = new QTextEdit(); yazi->setPlainText("Temizle butonuna basarsan bu yazi silinir :)"); yazi->resize(550,300); gLayout->addWidget(yazi,15,0,1,3); QHBoxLayout *hLayout = new QHBoxLayout(); btnCik = new QPushButton("Cik Git"); hLayout->addStretch(10); hLayout->addWidget(btnCik,Qt::AlignRight); QVBoxLayout *aLayout = new QVBoxLayout(); aLayout->addLayout(gLayout); aLayout->addLayout(hLayout); setLayout(aLayout); connect(btnMesaj ,SIGNAL(clicked()),this,SLOT(mesajGoster())); connect(btnAc ,SIGNAL(clicked()),this,SLOT(dosyaAc())); connect(btnTemizle ,SIGNAL(clicked()),yazi,SLOT(clear())); connect(btnCik ,SIGNAL(clicked()),this,SLOT(reject())); connect(treeDosyalar, SIGNAL(doubleClicked(QModelIndex )),this, SLOT(treeAc(const QModelIndex ))); } form.cpp

lk olarak resize fonksiyonu ile QDialog 'un genilik ve yksekliini ayarlyoruz - Tamamen keyfi :) - . Bir QGridLayout nesnesi (gLayout) oluturuyoruz. Izgara yerleimi (Grid layout) adndan da anlald zere yerleiminizi blnm kareler (yada dikdrgtenler ;) ) yardmyla yapmanz salyor. Olduka kullanl ve kolay. Grid yerleimine kontrolleri(widget) addWidget fonksiyonu ile yerletiriyoruz. addWidgetin ald deerler srasyla : eklenecek kontrol ismi (widget name), yerletirilecek satr(row), yerletirilecek kolon(column), ierdii satr (rowspan), ierdii kolon (column span) ve hizalama(alignment ). rnein gLayout->addWidget(yazi,15,0,1,3); satrnda QTextEdit nesnesi 15 inci satr, 0 nc kolona , 1 satr ve 3 kolon 'u kapsayacak ekilde ekliyoruz. gLayout->addWidget(lblAc,1,0); satrnda addWidget'in sadece satr ve kolon bilgileri isteyen overload 'unu kullandm sylememe gerek yok sanrm ;) btnCik (k dmesi) 'ni eklemek iin bir yatay yerlesim nesnesi (QHBoxLayout) oluturuyoruz. QHboxLayout 'u kontrolleri yatay yerletirmek iin kullanyoruz. hLayout>addWidget(btnCik,Qt::AlignRight); satryla k dmesini saa hizal olarak ekliyoruz. Bundan nceki satrda addStretch fonksiyonunu ardma dikkat edin, gerginlik(stretch) ayarn yapmassanz yerletirdiiniz dme kolon geniliinde grnr. Dikkat ederseniz tm yerleim nesnelerine bir kontrol eklemek addWidget fonksiyonuyla ekliyoruz. Oluturduumuz QGridLayout ve QHBoxLayout 'u alt alta yerletirmek iin yatay yerleim (QVBoxLayout) nesnesi oluturuyoruz. Yalnz ekleyeceimiz nesneler birer yerleim(layout) olduundan bu sefer addLayout fonksiyonunu kullanyoruz. Son olarak setLayout fonksiyonu ile QDialog 'umuzun yerleimi olarak tm layoutlarmz barndran aLayout -QVBoxLayoutnesnemizi ayarlyoruz.SIGNAl ve SLOT 'lar iin birinci derse bakabilirsiniz ;) /*--- main.cpp ---*/ #include "form.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication app (argc,argv); Form form; form.show(); return app.exec(); }

main.cpp main.cpp kaynak kod dosyas iinde nceden aklanmayan hibir kod paras yok ;) Derleme ve altrma Yazdnz program (eer yazdysanz) altrdysanz linux altnda yle bir ekran grnts ile karlamalsnz :

Ksaca almasna bakarsak : Mesaj Gster yazan dmeyi tklarsanz mesaj grrsnz. Dosya a butonuyla yada aa yardmyla dosya seebilirsiniz. Temizleye basarak yazlar silebilir k dmesiyle de kabilirsiniz :) Hepsi bu. Son Sz Yaznn banda bahsettiim gibi yerleimleri (layout) renmek iin fazla fazla kodlar yazdk :) Kodlar fazla iirmemek iin hata kontrol yapmadm. Yani metin dosyas dnda bir dosyay amaya almayn :) Amaya alrsanz ne olaca konusunda bir fikrim yok .

Telif Hakk ve Lisans Bu belgenin, QT Eitimi - 2 : Yerleim (Layout) , 1.0 srmnn telif hakk 2006 nder ARSLAN'a aittir. Bu belgeyi, Free Software Foundation tarafndan yaynlanm bulunan GNU zgr Belgeleme Lisansnn 1.1 ya da daha sonraki srmnn koullarna bal kalarak kopyalayabilir, databilir ve/veya deitirebilirsiniz. Bu Lisansn bir kopyasn http://www.gnu.org/copyleft/fdl.html adresinde bulabilirsiniz. Linux, Linus Torvalds adna kaytl bir ticar isimdir. Qt, TrollTech adna kaytl bir ticari isimdir. Feragatname Bu belgedeki bilgilerin kullanmndan doacak sorumluluklar, ve olas zararlardan belge yazar sorumlu tutulamaz. Bu belgedeki bilgileri uygulama sorumluluu uygulayana aittir. Tm telif haklar aksi zellikle belirtilmedii srece sahibine aittir. Belge iinde geen herhangi bir terim bir ticar isim ya da kuruma itibar kazandrma olarak alglanmamaldr. Bir rn ya da markann kullanlm olmas ona onay verildii anlamnda grlmemelidir.

You might also like