Bonjour à tous

D'après ce que j'ai lu ici et là, le pyqtSlot permet(trait) de surcharger un slot. Comme la surcharge (plusieurs fonctions de même nom mais avec signatures différentes) n'existe pas en Python, le décorateur pyqtSlot offre cette possibilité. C'est ce qui est écrit ici: https://www.riverbankcomputing.com/s...slot-decorator avec plusieurs méthodes "foo" en exemple.

Sauf que de ce que j'ai essayé, je n'y arrive pas !

Premier essai: un bouton. Son signal "clicked" pouvant être avec ou sans info
Code python : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/usr/bin/env python3
# coding: utf-8
 
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
 
class myWidget(QWidget):
	def __init__(self):
		super().__init__()
		btn=QPushButton("bouton", parent=self)
		btn.setObjectName("xxx")
		mainLayout=QVBoxLayout(self)
		mainLayout.addWidget(btn)
		QMetaObject.connectSlotsByName(self)
 
        @pyqtSlot(bool, name="on_xxx_clicked")
	def on_xxx_clicked(self, b):
		print("on_quit_clicked[bool]", b, type(b))
 
        @pyqtSlot(name="on_xxx_clicked")
	def on_xxx_clicked(self):
		print("on_quit_clicked")
 
if __name__ == '__main__':
	import sys
	app=QApplication(sys.argv)
	widget=myWidget()
	widget.show()
	sys.exit(app.exec())
Seul le second "on_xxx_clicked" (celui sans booléen) est appelé. Et si j'inverse les deux méthodes, alors c'est c'est celle avec booléen. Bref c'est la dernière méthode qui est appelée.

Ensuite je vois un truc qui parle de QSpinBox qui envoie deux signaux identiques, un avec un int et l'autre avec un str

Donc rebelote...
Code python : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/usr/bin/env python3
# coding: utf-8
 
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
 
class myWidget(QWidget):
	def __init__(self):
		super().__init__()
		spn=QSpinBox(parent=self)
		spn.setObjectName("xxx")
		mainLayout=QVBoxLayout(self)
		mainLayout.addWidget(spn)
		QMetaObject.connectSlotsByName(self)
 
        @pyqtSlot(int, name="on_xxx_valueChanged")
	def on_xxx_valueChanged(self, b):
		print("on_xxx_valueChanged[int]", b, type(b))
 
        @pyqtSlot(str, name="on_xxx_valueChanged")
	def on_xxx_valueChanged(self, b):
		print("on_xxx_valueChanged[str]", b, type(b))
 
if __name__ == '__main__':
	import sys
	app=QApplication(sys.argv)
	widget=myWidget()
	widget.show()
	sys.exit(app.exec())
... et toujours même souci: seul le dernier slot est appelé.

Donc ma question: y a-t-il un truc que j'ai raté quelque part ?

Merci à tous.