Почему это автоматическое соединение?
Функция loadUi()
внутренне вызывает метод connectSlotsByName () , который устанавливает автоматическое соединение, если какой-либо метод имеет структуру:
C ++:
void on_<object name>_<signal name>(<signal parameters>);
Python:
def on_<object name>_<signal name>(<signal parameters>):
В вашем случае метод on_pushButton_clicked
удовлетворяет этому требованию, поскольку у вас естьQWidget
(унаследовано от QObject) pushButton с именем объекта "pushButton"
:
<widget class="QPushButton" name="pushButton">
с сигналом с именем clicked
.
Почему вы вызываете один и тот же метод дважды?
QPushButton имеет перегруженный сигнал щелчка, то есть существует несколько сигналов с одинаковым именем, но с разными аргументами.Если документы проверены:
void QAbstractButton::clicked(bool checked = false)
Хотя может быть сложно понять, что приведенный выше код эквивалентен:
clicked = pyqtSignal([], [bool])
И это похоже на:
clicked = pyqtSignal()
clicked = pyqtSignal([bool])
Таким образом, в заключение QPushButton имеет 2 сигнала щелчка, которые будут подключены к функции on_pushButton_clicked, поэтому, когда вы нажимаете кнопку, оба сигнала будут излучаться, вызывая оба одинаковых метода, так что нажатие будет напечатано 2раз.
Соединения не учитываются, если предыдущий сигнал был подключен тем же способом, поэтому при вашем ручном соединении будет 3 соединения (2 сигнала нажаты без аргументов [1 автоматическии еще один вручную] и 1 с сигналом, нажатым с аргументом), поэтому метод будет вызываться 3 раза.
Когда вы используете декоратор @pyqtSlot
, вы указываете сигнатуру (то есть тип аргументов), поэтомуметод connect устанавливает соединение только с сигналом, соответствующим сигнатуре слота, so вы больше не видите проблему, поскольку используете сигнал без аргументов