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

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

Как работает механизм?

49
задан iTayb 9 November 2012 в 02:31
поделиться

3 ответа

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

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

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

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

50
ответ дан 7 November 2019 в 11:52
поделиться

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

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

8
ответ дан 7 November 2019 в 11:52
поделиться

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

Еще несколько примечаний:

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

Похожие вопросы: