2012-06-11 14 views
14

Używam jednego połączenia sygnału i gniazda w bloku. Mój kod następującoGniazdo jest wywoływane wiele razy za każdym razem, gdy emitowany jest sygnał.

w a.cpp

{ 
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())); 

} 

Wewnątrz funkcji get(), kiedy to stwierdzenie emitować wykonuje, szczelina jest nazywany wiele razy. Gdzie jak według mnie powinno zadzwonić tylko raz.

+4

Czy upewniłeś się, że 'connect' nie jest wywoływane wiele razy ?? !!! Pokaż nam trochę więcej kodu. W której funkcja 'connect' i' disconnect' została napisana? – Ammar

+2

Ile razy 'emuluje' wywołane w 'get()'? – cmannett85

+2

Ten kod wygląda dobrze. Teraz opublikuj brzydką część swojego kodu! – ScarCode

Odpowiedz

26

Jak stwierdzono w niektórych komentarzach, jest to zwykle spowodowane wywołaniem połączenia więcej razy. Slot będzie wywoływany raz za każdym razem, gdy zostanie nawiązane połączenie. Na przykład poniższy kod spowoduje, że slot() zostanie wywołane 3 razy, gdy signal() zostanie wyemitowane jeden raz.

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

Jeśli robisz Łączy w kodzie, które można uruchomić więcej niż jeden raz, to generalnie dobry pomysł, aby użyć Qt::UniqueConnection jako 5th parametru. Poniższy kod spowoduje, że slot() zostanie wywołany 1 raz, gdy signal() zostanie wydany jeden raz.

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); 

Zgaduję powód Twój kod nie działa poprawnie to dlatego, że pomijając 5th parametr i podłączyć do Qt::DirectConnection domyślne (dla pojedynczych programów gwintowanych). To natychmiast wywołuje slot tak, jakby był wywołaniem funkcji. Oznacza to, że możliwe jest wywoływanie połączenia przed rozłączeniem (jeśli w twoim programie są pętle).

+0

, jeśli emitujesz sygnał, wtedy tylko slot jest nazywany prawym? nie ma znaczenia ile razy użyłeś instrukcji connect .. czy mógłbyś opisać coś na Qt :: uniqueconnection .. skoro jestem nowy w qt, więc nie mam na ten temat więcej pomysłu .. – Kenta

+1

It * does * matter how wiele razy dzwoni się po łączenie *, chyba że * używasz Qt :: UniqueConnection. Jeśli robisz połączenia w funkcji i wywołujesz tę funkcję więcej niż jeden raz, musisz użyć Qt :: UniqueConnection lub twój slot zostanie wywołany wiele razy. Edytowałem swój post, aby spróbować pokazać, że trochę lepiej. –

+0

@ Rick - Thankxxx – Kenta

Powiązane problemy