2012-06-11 24 views
14

Bir blokta bir sinyal ve yuva bağlantısı kullanıyorum. Benim kod olarak bu yayarlar deyimi yürütür olsun() fonksiyonu içinde Yuvası, her sinyal gönderildiğinde birden çok kez çağrılıyor

{ 
QObject::connect(m_ptheFlange2Details,SIGNAL(GetFlang1DimAfterAnalysis()), 
       this,SLOT(GetFlang1DimAftrAnalysis())); 

m_ptheFlange2Details->get();// one function inside which i am emiting 
          // GetFlang1DimAfterAnalysis() signal ; 

QObject::disconnect(m_ptheFlange2Details,SIGNAL(GetFlang1DimAfterAnalysis()), 
        this,SLOT(GetFlang1DimAftrAnalysis())); 

} 

a.cpp

yılında

izler, yuva çok kere denir. Bana göre nerede sadece bir kez çağırmalıdır.

+4

'connect''in birden çok kez çağrılmadığından emin misiniz ?? !!! Lütfen bize biraz daha fazla kod göster. 'Connect' ve' disconnect' işlevi hangi fonksiyonda yazılmıştır? – Ammar

+2

'get()' içinde kaç kez 'emit' denir? – cmannett85

+2

Bu kod güzel görünüyor. Şimdi kodunuzun çirkin kısmını gönderin! – ScarCode

cevap

26

Bazı yorumlarda belirtildiği gibi, bu genellikle bağlantıyı bir kez daha çağırmaktan kaynaklanır. Bağlantı, her bağlantı için bir kez çağrılacaktır. Örneğin, aşağıdaki kod signal() bir kez yayınlandığında 3 kez çağrılan slot() ile sonuçlanacaktır. Eğer birden fazla kez çalıştırmak olabilir kodunda erişim sağlanır yapıyorsanız

connect(obj, SIGNAL(signal()), obj2, SLOT(slot())); 
connect(obj, SIGNAL(signal()), obj2, SLOT(slot())); 
connect(obj, SIGNAL(signal()), obj2, SLOT(slot())); 

, genellikle 5 parametre olarak Qt::UniqueConnection kullanmak için iyi bir fikirdir. Aşağıdaki kod, bir kez signal() yayınlandığında 1 kez çağrılan slot() ile sonuçlanacaktır. Eğer 5 parametrenin atlanması ve (tek dişli programlar için) Qt::DirectConnection varsayılan olarak bağlamak çünkü ben senin kod düzgün çalışmıyor nedenini tahmin ediyorum

connect(obj, SIGNAL(signal()), obj2, SLOT(slot()), Qt::UniqueConnection); 
connect(obj, SIGNAL(signal()), obj2, SLOT(slot()), Qt::UniqueConnection); 
connect(obj, SIGNAL(signal()), obj2, SLOT(slot()), Qt::UniqueConnection); 

olduğunu. Bu, hemen bir işlev çağrısı sanki yuvayı çağırır. Bu, bağlantı kesilmeden önce bağlantının yeniden çağrılabileceği anlamına gelir (programınızda döngüler varsa).

+0

için sorunun ne olduğunu anlayamıyorum, o zaman sadece yuva doğru çağrılıyor? Ne kadar çok kez connect deyimini kullanmış olmanız fark etmez .. lütfen Qt :: uniqueconnection üzerinde bir şey tarif edebilir misiniz? qt için yeni olduğumdan, bu yüzden daha fazla fikrim yok .. – Kenta

+1

It * does * nasıl Birçok kez aramanız gerekir * * Qt :: UniqueConnection kullanırsanız. Bir fonksiyonda bağlantı kurarsanız ve bu fonksiyonu bir defadan fazla çağırırsanız, Qt :: UniqueConnection öğesini kullanmanız gerekir, aksi takdirde slotunuz birden çok kez çağrılır. Mesajımı daha iyi göstermeye çalışmak için düzenledim. –

+0

@ Rick - Thankxxx – Kenta

İlgili konular