19
Şub

Bir önceki dersimizde qt creator’u kurmuş bir iki şeye göz gezdirmiştik. Şimdi bir uygulama yaparak bir şeyler daha öğrenelim. Bir iki not ile başlayayım işe pardus 2011 sürümünde qt creator’un son sürümü bulunuyor, elle indirip kurmanıza gerek yok, paket yöneticisinden kurabilirsiniz.

Genel Bilgiler

Biraz qt ile ilgili temel şeylerden bahsedeyim. Qt sınıfındaki her şey QObject‘ten türemiştir. Görsel şeyler(tabwidget, label), QObject’ten türemiş QWidgetlerdir. Yani bir QLabel hem qobjectin hem de qwidget’in özelliklerini barındırır.

Derleme işleminden bahsedeyim. Derleme için qmake, make kullanılır. Tabii biz qt creator kullanacağımız için derleme işlemini ctrl + r ile halledeceğiz :)

Basit Bir Örnek

Qt Creator’den File->New File or Project->Qt GUI App. -> Gerekli adımları tamamladıktan sonra yeni bir proje oluşacak.

Şimdi içeriğine bakalım: en üstte bir dizin simgesi var ve yanında projenizin adı var. Bu projeniz :) . Altında bir .pro dosyası var. Bu önceki dersimde dediğim gibi proje dosyanız, proje bilgilerini içinde tutuyor. Onun altında 2 dizin daha var. Sources ve Headers. Bunlar projelerinizin kaynak dosyaları ve başlık dosyalarının dizinleri. Sourcesin içindeki main.cpp dosyası programınızı çalıştırmaya yarayan dosyadır(önceki derse bakın.). Headers’ın içindeki mainwindow.h dosyası Sources’in içindeki mainwindow.cpp’nin başlık dosyasıdır. En altta da Forms dizini bulunmakta. Buda formlarınızın bulunduğu dizindir. Buradaki formlar .ui uzantılıdır..ui dosyaları tasarım dosyalarıdır. Qt Creator derleme yapaken bunları c++ koduna otomatik olarak çevirir.

Şimdi basit bir metin not defteri uygulaması yapalım. Ama önce:

Sinyal/Slot Olayı

Örneğimize devam etmeden önce  sinyal slot kavramı üzerinde duralım. Nedir bu? Örneğin formunuzda bir button var. Buna tıkladığınızda bir şeyler yapmasını istiyorsunuz. Yani buttona tıklandığında bir sinyal çıkıyor ve o sinyali bir slot’a bağlayarak işlemlerimizi yapıyoruz. Peki neyi nasıl bağlarız:

connect(dugme, SIGNAL(clicked()), this, SLOT(close()));

Burada örnek olarak dugme’nin clicked() olayını this’in(yani formumuzun) close() olayına bağladık. Yani dugme’ye basıldığında formumuz kapanacak.

Örneğe Devam

Forms altındaki mainwindow.ui’ye çift tıklayalım ve aşağıdaki gibi bir form oluşturalım:

Bunları yaptıktan sonra Dosya Oku butonuna sağ tıklayıp -> Go to slot..’a basın. Select Signal penceresi gelecek oradan da clicked()‘a çift tıklayın. Böylece pushButtonun tıklanma olayını boş bir slota bağladık.(Üstteki anlattığım connect işlemini kendi otomatik ayarladı.) Ve bizi slotun içine yönlendirdi.

void MainWindow::on_pushButton_clicked()
{
}

Kodlarımızı bunun içine yazacağız artık.

QString str = QFileDialog::getOpenFileName(this, "Açılacak dosyayı seçin", ".", "Metin dosyaları (*.txt)");
QFile file(str);
file.open( QIODevice::ReadOnly | QIODevice::Text );
ui->plainTextEdit->setPlainText(file.readAll());
file.close();

1. satırda bir dosya açma diyaloğu gösterdik ve burdan gelecek dosya adını str’ye eşitledik. 2. satırda file adında bir QFile oluşturduk ve dosya yolunu str olarak belirledik. 3. satırda dosyamızı sadece okumak için açtık. 4. satırda plainTextEdit’e dosyanın içeriğini okuduk. 5. satırda da dosyamızı kapattık.

Çok biliyormuşum gibi bir şeyler anlatmaya çalıştım, yanlışım olmuş ise uyarırsanız, anlamadığınız yer olursa yazarsanız sevinirim. Yeni bir derste görüşmek üzere iyi günler :)

18
Oca

Aşağıdaki kodu derleyip çalıştırdığınızda çıktı ne olur?

#include <stdio.h>

#define f(x) x*3

int main() {
    int y = f(1 + 2);

    printf("y = %d\n", y);

    return 0;
}

y = 9 diyenler yanılıyor. f bir makro olduğu için kod derlenmeden önce aşağıdaki hale getiriliyor pre-processor tarafından:

...

int main() {
    int y = 1 + 2 * 3;

    printf("y = %d\n", y);

    return 0;
}

Çarpma işlemi, toplamaya göre öncelikli olduğundan (2 * 3) + 1 işlemi 7 sonucunu veriyor:

$ gcc -o test test.c
$ ./test
y = 7

Makroları bilerek kullanmak gerekiyor, ezberlemeden.

4
Nis

C programlama dili ile en basit programımızı ornek.c adı ile “Merhaba Dunya” yı yazalım:

 #include 

int main() {printf("Merhaba Dunya") ;return 0;}

Bu program konsola “Merhaba Dunya” yazdırır. Linux’ta bunu nasıl yacağınıza ve nasıl derleyeceğinize bakalım. Ubuntu veya Pardus’ta bunu deneyebilirsiniz. Derleme komutları genel linux komutları içerisine girdiği için her ikisinde de çalışacaktır.

Ubuntu’da Uygulamalar menüsünden Metin Düzenleyici ile kodları bir metin belgesine yazabilirsiniz. Ben Metin Düzenleyici’yi çok beğeniyorum. Bunun Windows’daki karşılığı Notepad++ programı oluyor. Ya da Sistem menüsünden Yönetim’e gelin ve açılan menüdeki Synaptic programı ile Kate yükleyebilirsiniz. Kate de gayet hoş bir program editleme yazılımı. Sadece C değil, bir çok programlama dilini algılayabiliyor ve o programın özelliklerine göre renklendirme yapıyor.

Siz C programlama dili ile yazdığımız kodları kaydederken uzantısı .c olsun, ayrıca Türkçe karakter kullanmamaya özen gösterin. Örneğin ornek.c gibi. Bu yazdığımız kodları, daha sonra açtığımız Uçbirin (=Konsol=Teminal) ile derleyeceğiz.

Ya da hem kod yazalım hem de bunları derleyen bir program kullanmak istersek NetBeans tam bize göre. Ubuntu’da programlar geç güncellendiği için ben Netbeans’i internetten indirmeyi tercih ediyorum. http://netbeans.org/ sitesini ziyaret etmenizi öneririm.

Bu yazıyı yazdığım sırada en güncel Netbeans sürümü 6.8 olduğu için onu indirdim. İndireceğiniz Netbeans’ı şu sayfadan seçeceksiniz. Eğer pratik olsun, hemen insin isterseniz sadece C/C++ derleyicisi olarak kullanılan sürümü (30 MB olarak görünüyor) indirin. Download yazısına tıkladığınızda açılan pencereden dosyayı kaydet diyeceksiniz. Dosyanın adı netbeans-6.8-ml-cpp-linux.sh gibi bir şey olacak. Ben 6.8′i indirdiğim için dosyanın adında 6.8 diyor. Bu sh uzantılı dosyayı masaüstünüze kaydedin.

Açtığınız Uçbirimde önce masaüstüne gelmeniz grekiyor. Konsola cd Masaüstü/ yazdığınızda artık çalıştığınız dizin masaüstü olacaktır. Sonra şu komutu verdiğinizde sizden kullanıcı şifrenizi istecek ve siz şifrenizi girdikten sonra Netbeans kurulumu başlayacak:

sudo sh netbeans-6.8-ml-cpp-linux.sh

Adım adım Netbeans kurumu yapacaksınız ve daha sonra Netbeans’ı açtığınızda, orda New Project gibi seçenekler seçerek, kodları yazacağınız dosyayı yaratacaksınız. Size bir sürü seçenek sunacak. Bir C Konsole Aplication yazdığınızı düşünebilirsiniz.

C kodlarının derlenmesi için bilgisayarınızda gcc ve gdb‘nin kurulu olması gerekiyor. Synaptic’ten yüklü olup olmadığına bakabilirsiniz. Yüklü ise, hangi sürümünün yüklü olduğunu öğrenmek için açtığınız uçbirim ekranına aşağıdaki komutları vermeniz yeterli.

GNU Debugger‘ın kısatması olan GDB‘yi kontrol etmek için:

gdb -v

komutunu vererek şu çıktıya benzer bir çıktı almanız gerekiyor:

GNU gdb 6.8-debian
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type “show copying”
and “show warranty” for details.
This GDB was configured as “i486-linux-gnu”.

GNU C Compiler‘ın kısatması olan GCC‘yi kontrol etmek için ise:

gcc -v

komutunu vereceksiniz. Mesela benim bilgisayarımda son satırda, gcc version 4.3.3 (Ubuntu 4.3.3-5ubuntu4) yazısı çıkıyor. Bu komutları vermek ve sonuçlarını almak için konsolda Root olmanıza gerek yoktur.

Derlerken kodların bulunduğu dizine cd komutları ile geçtim. Masaüstümde bulunan ornek adındaki klasörümde ornek.c adında bir C dili ile yazılmış programım var. Bunu önce gcc ile derliyorum. gcc -o  ornek ornek.c komutu yazdığım ornek.c’yi derlememe yarar. Bu komut genelde işe yarar, eğer bir compile hatası yok ise ekrana hiç bir şey basmaz.

İkinci komut -gdb3 parametresi alıyor. Bu komutu vererek derlediğim programda debug sonucu bir sürü hata ekrana basılıyor. Onu kullanmadan da kodları çalıştırmak mümkün.

seval@seval-laptop:~/Masaüstü/ornek$ gcc -o  ornek ornek.c
seval@seval-laptop:~/Masaüstü/ornek$ gcc -o -gdb3  ornek ornek.c

Bu komutlarda hata verilmez ise, çalıştığınız dizinde C programınızla aynı isimde ve uzantısız bir dosya oluştuğunu göreceksiniz. Bu aslında derlenmiş kodların çalıştırılmasını sağlayan dosyadır. İngilizcede executable denilen, aslında çalıştırılabilir dosyadır. Programı derlerken -o ornek parametresi eklemezsek, ornek yerine a.out adında yeni bir dosya oluştuğunu görürüz. Mesela şu şekilde derlersek:

seval@seval-laptop:~/Masaüstü/ornek$ gcc ornek.c

Bu şekilde de program derlenebilir, fakat oluşturulan executable dosyaların adlarının birbirinden farklı olması ve anlaşılır olması olması için -o parametresini kullanmanızı öneririm.

Programı çalıştırmak için executable dosyayı çağırıyoruz:

seval@seval-laptop:~/Masaüstü/ornek$ ./ornek

Yani ./ornek komutunu veriyorum. Böylece konsolda programın çalıştığını görüyorum.

Share and Enjoy: Twitter Facebook FriendFeed Tumblr Google Bookmarks del.icio.us LinkedIn email Identi.ca MySpace StumbleUpon Technorati Posterous RSS Reddit Digg Yahoo! Buzz Yahoo! Bookmarks blogmarks Suggest to Techmeme via Twitter Netvibes Live

16
Kas

Son girdimden sonra uzun zamandır günlüğüme bir şey yazmamışım. Önemli gelişmeler hakkında kısa kısa bilgi vereyim:
* Artık eskisi kadar Pardus’a gereken ilgiyi gösteremiyorum, bazen benim geliştiricilik hayatımdaki yalnızlığımı farkeden arkadaşlar özel bir eposta atıp “Size yardımcı olmak istiyoruz, biz de katkıcı olmak istiyoruz.” şeklinde isteklerde bulunuyorlar. Birçoğuna cevap veremedim bile; ama darılmasınlar. Ne ben geliştiriciliği bıraktım, ne de sizin geliştirici olmanızda hiçbir şekilde engel yok. Önce Pardus wiki’sindeki geliştirici belgelerini okumakla başlayın[1], sonra da birilerinin size bir şeyler yaptırmasını beklemeksizin biran evvel faaliyete geçin. Hata yapmaktan da çekinmeyin. Önemli olan, geliştiriciler sizden hatanızı düzeltmenizi istediğinizde, o hatayı bir daha yapmamak için elinizden geleni yapmak.

* İstanbul’da güzel bir yerde çalışmaya başladım. Hayatımın çoğunu artık İstanbul’da geçiriyorum. Eskişehir’de artk çok bir işim kalmadı. işimin Python ve web işleriyle ilgili olması biraz benim şansıma denk geldi. Yıllardır içimde biriktirdiğim Python ile bir web uygulaması yapma enerjisini artık güzel sonuçlar doğurması umuduyla tüketiyorum.

* Puding’le[2] de iş yoğunluğundan dolayı ilgilenemiyorum; ama ileride sürpriz yapma olasılığım var. Bunun yanında Twity[3] ile ilgili ilerleyen zamanlarda güzel gelişmeler duyacağınızı umuyorum.

* Kimseye kırgın, dargın veya üzgün değilim. Her şey olması gerektiği gibi ve her şey yerli yerinde.

* C++ öğrenmeye devam =)

[1]: http://tr.pardus-wiki.org/Pardus:İçindekiler#Geli.C5.9Ftirici_.2F_teknik
[2]: http://github.com/gkmngrgn/puding
[3]: http://github.com/tunix/twity

2
Nis

Ah evet, dün lanet olsun ki Nisan’ın 1′iydi ve iki farklı şakaya maruz kaldım. Bunlardan birincisi Aaron Griffin’den:
http://www.archlinux.org/pipermail/arch-dev-public/2009-March/010971.html

Bir Archlinux kullanıcısı için fazlasıyla anlamsız bir epostaydı. Yerel eposta listemizde de benzeri şaka Alper Kanat tarafından yapıldı:
http://liste.archlinuxtr.org/pipermail/archlinux/2009-April/000652.html

Bunun üstüne bir de Xfce geliştiricisi Jannis Pohlman’den şaka geldi:
http://foo-projects.org/pipermail/xfce4-dev/2009-April/026509.html

Halbuki geçen sene böyle miydi, Pardus’un önemli geliştiricilerinden Çağlar Onur bana geliştiriciliği geçen yılın 1 Nisan’ında müjdelemişti ve başlangıçların en güzelini yaşamıştım. Evet, bu bir başlangıçtı; çünkü ben Pardus’un gelişimine katkıda bulundukça, karşılığında eğitim, öğrenim, tecrübe ve gerçekten de keyif alacaktım. Aldım da…

Bu geçen süre zarfında bazı kararlar vermem gerekti. Öncelikle Xfce kullanıcısıydım ve Xfce paketlerinden sorumlu olmaya başlamıştım. Şimdi benim yerime geçebilecek potansiyel arkadaşlar arıyorum ve onlara elimden geldiğince destek olmaya çalışıyorum. Diğer taraftan, her ne kadar C# bildiğimi söyleyemesem de, Mono projesi ile ilgili uygulamaları paketlemek, bunların depoya girmesini sağlamak ve güncellemekle uğraşıyorum.

Son olarak, uzun zamandır Python’un yanında ikinci bir dil öğrenme gibi çabalarım vardı ve hobi amaçlı olarak işlevsiz ama eğlenceli kodlar yazmaya başladım. Geçen gün bir arkadaşımdan c dersi alırken şöyle eğlenceli bir kod yazdık:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <unistd.h>
#define x 100
 
static void fcark (const int repeat) {
    int i = 0;
    const char cark[5] = "\\|/-";
 
    printf("cursor =>  \t");
 
    for (; i < repeat; i++) {
        printf("\b\b%c\t", cark[i % 4]);
 
        usleep(30000);
        fflush(stdout);
    }
}
 
int main() {
    fcark(x);
 
    printf("\b\bDone.\n");
    return 0;
}

Pek sağlıklı bir yazımım olmayabilir; ama kod çalışıyor. Ne mi yapıyor? İmleci 100/4 (x değişkenine göre) defa kendi etrafında belli aralıklarla (usleep içindeki değerle) döndürüyor. Deneyin, elleşin, hatta biraz daha geliştirin, sonra bana da gösterin! =)

Nice yıllara, yeni geliştiricilerin ve yeni -gerçek- programcıların şerefine..