19 Temmuz 2011 Salı

Konsol Bölümlerini Kapatma

Bugün daha önce yaptığım konsol bölümlendirmelerini  kapatma işini tamamladım.Bu iş basit gibi gözüksede beni çok oyaladı , çünkü iç içe bir çok splitter yerleştirildiğinden kapatacağımız splitterın parentını alma ve bu parent üzerinden çeşitli kontroller yapılması gerekiyordu. Neyse ki bugün tamamlandı.

Bölümleri kapatma işini rekursif olarak yapmam gerektiğini biliyordum fakat bunu tek bir metotla halledemedim, çünkü nedenini bilmediğim bir şekilde shortcut içinde çağrılan fonksiyona parametre gönderildiği zaman shortcut düzgün çalışmadı. Bende bunu iki farklı fonksiyon tanımlayarak hallettim. Tanımladığım ilk fonksiyonda seçilen widgetın parentını alarak splittera ulaştım ve termwidget nesnesini deleteLater() metodunu kullanarak sildim. Sonrasında seçilen splitterı rekursif olarak çağıracağım fonksiyona parametre olarak gönderdim.


def yokedici(self):
        secilenWidget=self.focusWidget().parent()
        secilenSplitter=secilenWidget.parent()
        secilenWidget.deleteLater()
        self.rekursiveDelete(secilenSplitter)

 Rekursif fonksiyonun içinde öncelikle bu splitterın mainwindowa yerleştirilen ilk widget olup olmadığını kontrol ettim ve eğer bu splitter ilk splitter ise splitterı silmeden içine yeni bir termwidget nesnesi oluşturarak fonksiyondan çıktım. Fakat eğer splitter ilk splitter değilse gelen splitterın parentını aldım ve bu splitterı sildim.
Elde ettiğim parent splitterın içinde kaç tane splitter olduğu kontrolunu yaptıktan sonra eğer başka splitter yoksa parent splitterı rekursif fonksiyona parametre olarak gönderdim. Eğer parentın sileceğimiz splitterdan başka splitterı varsa parent splitter içindeki sonraki çocuk splittera fareyi odaklayarak  fonksiyondan çıktım.


parent=gelenSplitter.parent()
            gelenSplitter.deleteLater()
            if(parent.count()==1):
                self.rekursiveDelete(parent)
            print "splitter siliniyor"
            parent.focusPreviousChild()
Bu aşamada cink konsolu ile ilgili yapılacak sağ tıklama ve konsolun f12 ile açılması işleri kaldı. Bu işlerinde  kısa zamanda tamamlanacağını düşünüyorum.

Cink Konsolunu Bölümlendirme

Bir süre önce başladığımız cink projesinde almış olduğum konu konsolu yakuakedeki gibi bölümlendirebilmekti. Stajın ilk iki haftası boyunca bu konuyla ilgilendim. İlk haftanın sonunda bölümlendirmenin nasıl yapılacağını kavramıştım,sadece bunu cink'in kodlarına aktarmak kalmıştı. PyQt ile geliştirmekte olduğumuzdan Qt'nin QSplitter sınıfını kullandım. QSplitter tam olarak içine istediğiniz gibi widget ve splitter yerleştirebileceğiniz bir widgettır . İlk olarak QMainWindow dan bir nesne oluşturdum ve bu nesneden bir splitter yarattım,bu splittere mainwindoun içine yerleştirdikten sonra splitterda bir değişiklik yapmadan içine bir QTermWidget nesnesi oluşturarak yerleştirdim. Bölümlendirme yatay ve dikey olacağından bende Horizontal ve Vertical olarak iki ayrı metot tanımladım ve bu metotlara erişimi QShortcut ile gerçekleştirdim. Bu shortcutları kodda mainin içinde yazdım.


shortcut = QShortcut("Ctrl+Shift+a",w,w.Horizontal)
shortcut = QShortcut("Ctrl+Shift+g",w,w.Vertical)


Daha sonrasında Vertical ve Horizontal metotlarının içine bölümlendirmeyi yapabilmek için birbirine çok benzer kodlar yazdım. Bu iki metodun tek farkı yönlendirme yapma kısmıydı yani :

selectedSplitter.setOrientation(Qt.Qt.Horizontal)

Bu kısım splittera ,bu splitterdan oluşturduğumuz nesneleri nasıl yerleştireceğini söylüyor. Başlangıçta splitterın içine yerleştirdiğim termwidget nesnesinin bu metotlarda kapatmam gerekti, bu şekilde oluşturduğum splittera yönlendirme yapabildim. Termwidget nesnesinin splitterdan kaldırdıktan sonra bu splitterdan iki tane splitter oluşturdum : splitter1=Qt.QSplitter(selectedSplitter)
 Bu splitterları oluşturduktan sonra başlangıctaki splittera yatay/dikey yönlendirme yaptım ve splitter içine yatar/dikey olarak yerleşen splitterların birinin içine daha önceden gizlemiş olduğum splitterı diğerine de yeni bir termwidget nesnesi oluşturarak yerleştirdim.


selectedWidget.setParent(splitter1)  yazdıktan sonra birde bu widgetı gösterebilmek için selectedWidget.show() satırını ekledim.


Bu şekilde her seferinde seçmiş olduğum termwidget nesnesini focusWidget() metodu ile alıp , bu nesnenin parent'ını alarak seçilen splittera ulaşmış oldum ve seçilen splitterdan  yatay/dikey olarak yönlendirme yaptıktan sonra iki tane splitter oluşturdum ve bu splitterların içine önceden focuswidget ile aldığım widget nesnesini ve yeni oluşturduğum widget nesnesini yerleştirerek konsolu yatay ve dikey olarak bölümlendirmeyi sağlamış oldum.
Konsolu bölümlendirdikten sonra şimdi ise bu bölümleri tekrar kapatma işi ile uğraşıyorum. Kapatmayı da tamamladıktan sonra o konuyla ilgili de açıklama yazacağım.

Anlatmış olduğum işin kodlarını incelemek isterseniz kodlara buradan bakabilirsiniz: http://svn.comu.edu.tr/websvn/filedetails.php?repname=Cink&path=%2Fproje%2Fcink.py