Ответ 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
(для однопоточных программ). Это немедленно вызывает слот, как если бы это был вызов функции. Это означает, что соединение можно снова вызвать до отключения (если в вашей программе есть петли).