PYQT5 - функция слота не принимает аргумент по умолчанию

Я работаю над интерфейсом PYQT5 с QPushButton, который должен вызывать функцию слота, которая имеет аргументы по умолчанию.

self.button = QtWidgets.QPushButton("Button")
self.button.clicked.connect(self.doSomething)

def doSomething(self, boolVariable = True):
  print(boolVariable)

Результат, когда я запускаю функцию doSomething:

[in] object_instance.doSomething()
--> True

но если я нажму на кнопку, я получу такой результат:

--> False

Может кто-нибудь объяснить мне, почему аргумент по умолчанию не принимается во внимание?

Благодарю вас !


person Mat4444    schedule 31.01.2020    source источник
comment
Связано: stackoverflow.com/questions/59970871/   -  person Heike    schedule 31.01.2020


Ответы (1)


Сигнал clicked QPushButton, как и любого класса, наследуемого от QAbstractButton, имеет аргумент checked, который представляет текущее проверенное («нажатое») состояние кнопки.

Этот сигнал испускается, когда кнопка активирована (т. е. нажата, а затем отпущена, когда курсор мыши находится внутри кнопки).

Кнопки издают сигнал щелчка, когда их отпускают; в этот момент кнопка не нажата и аргумент сигнала будет False.

Есть две возможности избежать этого:

  1. подключите сигнал к лямбде:

    self.button.clicked.connect(lambda: self.doSomething())

  2. добавьте в функцию декоратор pyqtSlot без подписи в качестве аргумента:

    @QtCore.pyqtSlot()
    def doSomething(self, boolVariable = True):
        print(boolVariable)
person musicamante    schedule 31.01.2020
comment
Спасибо. Итак, если я правильно понимаю, проверенный аргумент молча передается моей функции doSomething(), которая интерпретирует его как второй аргумент (boolVariable)? - person Mat4444; 31.01.2020
comment
@Mat4444 точно, и каждый параметр сигнала рассматривается как позиционный необязательный аргумент. Это может выглядеть странно, потому что, если вы не добавите никаких аргументов в функцию doSomething, она все равно будет работать без предупреждения, а если вы вызовете ее вручную с некоторыми аргументами, она выдаст исключение за превышение аргументов, но Qt может подключаться к функциям, у которых меньше аргументов, чем предоставляет сигнал, поэтому, если сигнал имеет три аргумента, а функция принимает только один позиционный аргумент, она все равно будет работать. - person musicamante; 31.01.2020