Слот вызывается несколько раз каждый раз, когда выдается сигнал

Я использую одно соединение сигнала и слота в блоке. Мой код выглядит следующим образом

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

}

Внутри функции get(), когда этот оператор emit выполняется, слот называется много раз. Где, по моему мнению, он должен вызывать только один раз.

Ответы

Ответ 1

Как указано в некоторых комментариях, это обычно вызвано вызовом connect more once. Слот будет вызываться один раз для каждого соединения. Например, следующий код приведет к тому, что slot() будет вызван 3 раза, когда signal() будет выпущен один раз.

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

Если вы выполняете соединения в коде, который может запускаться более одного раза, обычно рекомендуется использовать Qt::UniqueConnection в качестве 5-го параметра. Следующий код приведет к тому, что slot() будет вызываться 1 раз, когда signal() выдается один раз.

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

Я предполагаю, что ваш код работает некорректно, потому что вы опускаете 5-й параметр и подключаете значения по умолчанию к Qt::DirectConnection (для однопоточных программ). Это немедленно вызывает слот, как если бы это был вызов функции. Это означает, что соединение можно снова вызвать до отключения (если в вашей программе есть петли).