Подтвердить что ты не робот

Сигналы Qt и слот подключены дважды... что происходит?

Что произойдет, если один и тот же сигнал и слот подключены дважды?

Как обрабатывается механизм?

4b9b3361

Ответ 1

Несколько недель назад у нас был стажер, который случайно подключил сигнал к слоту более одного раза. Идея заключалась в том, что при одном условии у вас будет слот, подключенный к сигналу, и при другом условии вы его отключите. Когда вы изменили режим, вы выполните соответствующую работу.

Ну, он забыл отключиться, когда это уместно. Поэтому каждый раз, когда вы меняли режимы, у вас было новое соединение с слотом.

Конечный результат? 1 соединение == 1 вызов в слот. 2 соединения == 2 вызова в слот. 3 соединения == 3 вызова в слот и т.д. Эти вызовы произошли "одновременно" (я знаю, что в действительности они не были, поскольку они находятся в одном потоке событий, но я имею в виду, что все вызовы обрабатывались последовательно).

Как @Job указывает в одном из своих комментариев (он заслуживает доверия, поэтому, пожалуйста, не повышайте меня за свою работу), Qt::UniqueConnection предотвратит эту проблему.

Ответ 2

Обычно плохие вещи. Это вполне приемлемо для подключения слота два или даже больше раз, но когда сигнал будет запущен, ваш слот будет вызываться для каждого подключенного вами соединения, которое, вероятно, не является тем, что вы хотите.

Обратите внимание, что не обязательно неправильно иметь несколько соединений. Для него есть (возможно) совершенно правильные варианты использования. Они довольно редки, я, конечно, не могу думать о том, как я использовал его как функцию. Все ситуации, которые я могу вспомнить, где было несколько соединений, оказались ошибкой, а не предполагаемой.

Ответ 3

Слот выполняется несколько раз (как уже говорили другие).

Некоторые примечания:

  • В прежние времена шаблон "подключался ровно один раз" в тех случаях, когда раньше было соединение, заключалось в том, чтобы сначала вызвать разъединение, а затем подключиться для принудительного установления только одного соединения.
  • Теперь, начиная с версии 4.6, есть и более элегантный Qt:: UniqueConnection, см. http://doc.qt.io/qt-5/qt.html#ConnectionType-enum