SORU
25 EYLÜL 2010, CUMARTESİ


Qt Olaylar ve Sinyal/Slot

Qt dünya olayları arasındaki farkı ve/slot sinyal nedir?

Biri diğerinin yerini tutar mı? Olaylar sinyal/slot bir soyutlama?

CEVAP
25 EYLÜL 2010, CUMARTESİ


Qt, sinyaller ve olayları Observer pattern her ikisi de uygulamaları vardır. Farklı durumlarda farklı güçlü ve zayıf oldukları için kullanılırlar.

Öncelikle neymiş bakalım biz ne demek 'Qt' olay tam olarak: bir sanal işlevi bir Qt sınıfı olan sensin beklenen yeniden gerçeklemek için bir temel sınıf senin istiyorsanız, ele olay. Template Method pattern ile ilgili.

Bu kelimeyi kullandığımı nasıl not "kolu". Gerçekten de, burada sinyaller ve olayların niyet arasında temel bir fark var:

  • "kolugüçlü " olayları
  • "haberdar olsungüçlü " emisyon sinyal

Fark ne zaman "sorumluluk" "sınıfı dışında yararlı bir davranış. cevap almak" olayı, işleyen. Örneğin, bir sayı ile bir düğme olan bir uygulama düşünün. App kullanıcı düğmeyi düşünelim ve "" ve "aşağı" klavye tuşları. Yukarı tuşuna basarak numarayı değiştirmek gerekiyor Aksi takdirde düğmesine normal bir QPushButton (tıklandığında olabilir, vs.) gibi çalışması. Qt bu kendi küçük yeniden oluşturarak yapılır "QWidget reimplements" (QPushButton alt sınıf),:: keyPressEvent. bileşen Sözde kod:

class NumericButton extends QPushButton
    private void addToNumber(int value):
        // ...

    reimplement base.keyPressEvent(QKeyEvent event):
        if(event.key == up)
            this.addToNumber(1)
        else if(event.key == down)
            this.addToNumber(-1)
        else
            base.keyPressEvent(event)

Gördün mü? Bu kod, yeni bir soyutlama sunar: düğmesi gibi hareket eden bir parçacık, bazı ekstra işlevsellik ile ama. İşlevsellik çok uygun bu ekledi:

  • Bir sanal biz reimplemented beri, bizim uygulama otomatik olarak Sınıfımızda saklanmış oldu. Eğer Qt tasarımcıları bir sinyal keyPressEvent yapılmış olsaydı, QPushButton miras ya da sadece dışarıdan sinyal bağlanmak için karar vermek gerekir. Ama Qt sen olduğun için aptalca olurduher zamanözel bir davranış ile bir widget (iyi bir neden - yeniden kullanım/modüler) yazarken bekleniyor devralır. Yani bir olay keyPressEvent yaparak, keyPressEvent sadece işlevselliği temel bir yapı taşıdır amaçları bu ifade. Eğer bir sinyal olsaydı amaçlı değil ne zaman kullanıcı karşısına çıkan bir şey gibi görünürdü.
  • Fonksiyon-sınıf-uygulama mevcut olduğu için, biz kolayca bizim özel durumlarda (&tuşlarını yukarı ve aşağı) kullanma ve temel sınıfın geri kalanı bırakarak Chain-of-responsibility pattern uygulamak. Bu keyPressEvent bir sinyal olsaydı neredeyse imkansız olacağını görebilirsiniz.

Qt tasarımı iyi düşünülmüş - bizi buldularbaşarı çukura düşmekkolay doğru olanı yapmak zor ve yanlış bir şey, bir olay keyPressEvent yaparak bunu yaparak.

Öte yandan, QPushButton en basit kullanımı göz önünde bulundurunaz önce tıkladığınız zaman başlatmasını ve haber alma:

button = new QPushButton(this)
connect(button, SIGNAL(clicked()), SLOT(sayHello())

Bu açıkça tarafından yapılması gerekiyordukullanıcısınıf:

  • eğer alt düğmeye bir tıklama bize bildirmenizi istiyoruz her QPushButton zorunda kalsaydık, bu alt sınıfların bir sürü gerektiririyi bir neden için!Her zaman bir "Merhaba Dünya" messagebox tıklanma tamamen yeniden kullanılabilir değil yani tek olay sadece yararlıdır. gösteren bir widget Yine, başka seçeneğimiz yok ama doğru olanı - bağlanarak yapmak için dışarıdan.
  • birkaç yuvaları 4 ** - sayHello() çeşitli sinyaller bağlanmak isteyebiliriz. Sinyalleri ile yaygara yok. Sınıflara birlikte oturup uygun bir tasarım üzerinde karar verene kadar, bazı sınıf diyagramları düşünmek gerekir.

clicked() QPushButton yayar yerlerden biri mousePressEvent() Uygulama olduğunu unutmayın. clicked() mousePressEvent() ilgili olmaları değiştirilebilir - anlamına gelmez.

Yani sinyaller ve olayları farklı amaçlar için (ama her ikisi de "abone ol" bir şeyler oluyor bildirim). izin ile ilgili olan var

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Baby Big Mouth

    Baby Big Mou

    5 Mart 2013
  • Joshua Benedict

    Joshua Bened

    26 EKİM 2013
  • Press Start

    Press Start

    4 HAZİRAN 2006