Ö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.uiyazarak 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")ş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.
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
class MyWidget < Qt::Widgetbunları 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 :
slots 'set_color()'
def initialize parent=nil
super
@base=Ui_Form.new
@base.setupUi self
end
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 :
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
require 'second'İşte bu kadar kendi metodumuza yönlendirmeyi başardık. Artık program bir işe yaramaya başladı.
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
Hoşçakalın...
Hiç yorum yok:
Yorum Gönder