When using the pyqt signals of the UI elements such as buttons with decorated methods, the signal doesn't seem to work. Please find below the minimum reproducible code.
import sys
from PyQt5.QtWidgets import (QWidget, QToolTip, QPushButton, QApplication)
from PyQt5.QtGui import QFont
def ui_decorator(target_func):
def call(self, *args, **kwargs):
print("Init.")
ret_code = target_func(self, *args, **kwargs)
print("Deinit.")
return ret_code
return call
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
QToolTip.setFont(QFont('SansSerif', 10))
self.setToolTip('This is a <b>QWidget</b> widget')
btn = QPushButton('Button', self)
btn.setToolTip('This is a <b>QPushButton</b> widget')
btn.clicked.connect(self.button_action)
btn.resize(btn.sizeHint())
btn.move(50, 50)
self.setGeometry(300, 300, 300, 200)
self.setWindowTitle('Tooltips')
self.show()
@ui_decorator
def button_action(self):
print("Button Clicked")
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
In the above code if the button is clicked the call to the button_action function fails with the following message: TypeError: button_action() takes 1 positional argument but 2 were given. But the code works alright when I don't use the decorator (ui_decorator), even though it still takes only 1 positional argument.
Thanks