Сигналы Qt и слот подключены дважды ... что происходит? - PullRequest
46 голосов
/ 20 августа 2010

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

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

Ответы [ 3 ]

48 голосов
/ 20 августа 2010

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

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

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

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

6 голосов
/ 20 августа 2010

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

5 голосов
/ 20 августа 2010

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

Еще несколько заметок:

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