Soru Qt sinyali ve yuva için argüman türü, const referans niteleyicileri önemli midir?


Aşağıdaki tipte sinyal ve slot için

signals:
    void textChanged(const QString &);

public slots:
    void setText(const QString & text)

textChanged ve setText argümanlarının türü, const ve &. Sabit ve referans yeterlilik, QString kullanılarak karşılaştırıldı mı?

QObject::connect(a,SIGNAL(textChanged(QString)),b,SLOT(setText(QString)));
QObject::connect(a,SIGNAL(textChanged(const QString &)),b,SLOT(setText(const QString &)));

DÜZENLE: SIGNAL veya SLOT'ta uyumsuz tür kullanıldığında hata mesajlarını gösteren çıkış penceresini görmedim. Sinyal yuvası mekanizmasının derleme zamanında argüman tipi hatasını algılayabileceğini düşündüm.


21
2017-12-20 07:40


Menşei




Cevaplar:


Qt bir kontrol eder normalleştirilmiş imzaanlamı

Normalleştirme, boşlukları   minimum, 'const' öğesini öne taşır   uygun olduğunda, 'const' kaldırır   değer türlerinden ve const yerine geçer   değerler ile referanslar.


26
2017-12-20 10:17



Qt'nin sinyal ve slot mekanizmasını nasıl uygulayacağını tam olarak açıklayan bir makale var mı? ondan başka doc.trolltech.com/4.6/signalsandslots.html - yesraaj
Tam olarak daha ayrıntılı olarak mı yoksa tam olarak size rehberlik eden bir öğretici mi, başka bir hızda mı demek istiyorsunuz? - e8johan
Daha fazla detay ile, herhangi bir bağlantı takdir edilir :) - yesraaj
İnsanların beni kaynağa yönlendirmesinden nefret ediyorum, fakat QMetaObject :: normalizedSignature işlevinden başlayıp oradan da işinizi halledin. Oldukça küçük bir dize ayrıştırma durumu içeriyor, ancak bir kez gördüğünüzde bu oldukça basit. Kaynağı buradan okuyabilirsiniz: qt.gitorious.org/qt/qt/blobs/master/src/corelib/kernel/... . Bağlantılar QMetaObjects kullanılarak yapılmakta, yani tüm sihrin olduğu yer burasıdır. - e8johan
okumaya çalışmama izin ver ...... - yesraaj


Yasal Uyarı: Benim qt oldukça paslı, ancak sinyal / slot mekanizması hala sadece C ++ işlev çağrıları. Sinyal / yuva mekanizması nesneleri gerçekten dahili depolama birimine kopyalarsa, özrümlerim (Qt sayfalarını kontrol etmeniz gerekir, sinyaller / yuvalar afaik'te büyük bir tane vardır) - aşağıdaki bitler yalnızca C ++ bağlamında alakalı olacaktır, C ++ + Qt bağlamında değil.

Referansı bırakırsanız, dize kopyalanacaktır (ve yapının önemli olmaması durumunda, yapılan herhangi bir değişiklik tek başına işlevde kalacaktır).
Referansta bırakırsanız ancak const'ı çıkarırsanız, yöntemin verdiğiniz dizeyi değiştirmesine izin verirsiniz. Her ikisi de çalışırlar, ama geçirdiğiniz nesneye farklı şeyler yaparlar (kopyalama miktarı / değişiklik tutma olasılığı).

Aşağıdaki kaynakları okumanızı öneriyorum:

(const doğruluğunda) https://isocpp.org/wiki/faq/const-correctness

(referanslarda) https://isocpp.org/wiki/faq/references

Bir parametrenin ne olduğunu tam olarak anlamak için nasıl void foo(const A&)/ void foo(const A)/ void foo(A&)/ void foo(A) hepsi farklı.


4
2017-12-20 07:53



Doğrudan bağlantılar için, gereksiz kopyalardan kaçınmak için değerlerin const referansı ile geçirilmesi önerilir. Kuyruklu bağlantılar için Qt, argümanları nasıl geçtiğinizin bir önemi kalmaz. - rpg