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();
}