3 Kasım 2010 Çarşamba

QT Designer Bölüm-2

Özgürlük İçin... Pardus...


Önceki yazıda RGB elde etmek için spinbox'lar ve slider'lar koyduk, ne güzel birbirine de bağladık. Bağladık ta ne renk olduğunu görmedik. Yaptık bi uygulama bari bir işe yarasın.


Qt kütüphanesi kullanırken nesneleri signal-slot bağlantıları ile birbirine bağlayabildiğimizi gördük. Peki biz bu sürgülerin gösterdiği değere karşı gelen rengi bir yerde görmek istersek ne olacak. 3 slider değerini tek bir nesnenin arkaplan rengine designer kullanarak bağlamamız mümkün değil. Bu durumda biraz kod yazmamız gerekecek.


Bu yazıda QtDesigner ile hazırlanan Ruby dosyası ile ayrı bir dosyada hazırladığımız kodları birleştireceğiz. İlk önce renklendirme yapmak için ekrana bir label ekleyeceğiz. Ardından bize lazım olan nesneleri isimlendireceğiz ve program yazacağız.

Önce QtDesigner'da eski "first.ui" dosyasını açalım ve "second.ui" adıyla kayıt edelim. Düzenleme modunda "Display Widgets" içinden bir Label'ı tutup formun en sağ kenarına çekip bırakalım. Sonra Label'ı çift tıklatıp yazısını silelim. Aşağıdaki şekil oluşacak:







Property Editor penceresinde Label'ın "objectName" özelliğini dispLabel olarak değiştirelim. Kırmızı renge bağlı slider ismini aynı şekilde "redSlider" olarak değiştirelim. Yeşilinkini "greenSlider" olarak mavininkini de "blueSlider" olarak değiştirelim. Sıra geldi sinyal-slot düzenlemesine, kayıtlarda olmayan yeni bir slot oluşturacağız. "redSlider"dan bir bağlantıyı alıp form üzerine bırakalım. Form üzerine bırakabilmek için en kenara çıkmak gerekiyor, dikkat edelim.



Bağlantı diyaloğunda sol tarafta slider sinyallerinden "valueChanged(int)" seçelim, sağ tarafta Form slotlarında birşey görünmüyor altındaki "Edit..." yazılı butonu tıkladığımızda açılan pencerede form nesnesinin slotları ve sinyalleri görünüyor. Slotlar kısmında + tuşuna tıklayıp yeni bir slot ekleyelim:



Slot adı olarak set_color() yazalım ve enter basalım. Tamam tıkladığımızda yeni bir slotumuz oldu. Diğer iki slider'dan da aynı slot'a bağlantı yapalım. Dosyamzı kaydedelim. Şimdi "second.ui" dosyasının olduğu klasörde bir komut satırı açıp,
rbuic4 -x -o second.rb second.ui
yazarak Ruby dosyamızı oluşturalım. Oluşan bu dosyayı çalıştırırsak
Object::connect: No such slot QWidget::set_color()
hata mesajı verecektir. Öntanımlı olmayan bir slot çağırdık şimdi onu tanıtacağız. Oluşan Ruby dosyasını incelersek en üstünde bu dosyada yapılan tüm değişikliklerin yeni bir "rbuic4" komutu sonrasında silineceği uyarısı vardır. Biz belki görselimizi daha değiştireceğiz, bu yüzden yapacağımız ilave ayrı bir dosyadan buraya müdahil olmalı. İlk önce "second_run.rb" adında bir yeni dosya oluşturalım. Bu dosyada ilk satır otomatikten gelen dosyaya çağrı :
require 'second'
bunun arkasından programı çalıştırmak için second.rb dosyasının en sonuna eklenmiş olan satırların bir kopyasını buraya alalım :
about = KDE::AboutData.new("form", "Form", KDE.ki18n(""), "0.1")
  KDE::CmdLineArgs.init(ARGV, about)
a = KDE::Application.new
u = Ui_Form.new
w = QT::Widget.new
u.setupUi(w)
a.topWidget = w
w.show
a.exec

şimdi yazdığımız programı çalıştırırsak aynı orjinalindeki mesajı alırız. Şimdi ana programda tanıtılan form içinde modifikasyon yapmak için ilaveler yapacağız. İlk önce sınıf tanımını tekrar yapıyoruz.
class MyWidget < Qt::Widget
  slots 'set_color()'
  def initialize parent=nil
     super
     @base=Ui_Form.new
     @base.setupUi self
  end
end

bunları ekledikten sonra çalıştıran koddaki "u = Ui_Form.new" satırını ve "u.setupUi(w)" satırını iptal ediyoruz. Orjinal kodu (second.rb) incelersek bu şekilde yaparak form tanımına dışardan ulaşmış olduğumuzu göreceğiz. En son "w = QT::Widget.new" satırını "w = MyWidget.new" olarak değişirip, müdahale gören sınıfı kullanmaya başlıyoruz. Şimdi çalıştıralım, bu sefer slot bulunduğu için uygulama çalışmaya başlayacak ama herhangi bir slider değerini değiştirmeye kalktığımızda method tanımlanmadığı için hata verecektir. İşte set_color() methodumuz :


def set_color
  clr = Qt::Color.new @base.redSlider.value, @base.greenSlider.value, @base.blueSlider.value
  setStyleSheet 'QLabel#dispLabel {background-color: %s}' % clr.name
end

önce slider değerlerinden bir renk oluşturuyoruz, sonra "dispLabel" arkaplan rengini bu renge eşitliyoruz. İlk açılışta arkaplan renginin eşitlenmesi için methodumuzu initialize rutini içinde de çağıralım en son durum şu olur :
require 'second'

class MyWidget < Qt::Widget
  slots 'set_color()'
  def initialize parent=nil
    super
    @base=Ui_Form.new
    @base.setupUi self
    set_color
  end

  def set_color
    clr = Qt::Color.new @base.redSlider.value, @base.greenSlider.value, @base.blueSlider.value
    setStyleSheet 'QLabel#dispLabel {background-color: %s}' % clr.name
  end

end



about = KDE::AboutData.new("form", "Form", KDE.ki18n(""), "0.1")
  KDE::CmdLineArgs.init(ARGV, about)
a = KDE::Application.new
#u = Ui_Form.new
w = MyWidget.new
#u.setupUi(w)
a.topWidget = w
w.show
a.exec

İşte bu kadar kendi metodumuza yönlendirmeyi başardık. Artık program bir işe yaramaya başladı.

 Hoşçakalın...

Hiç yorum yok:

Yorum Gönder