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
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.
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())
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...
... et toujours même souci: seul le dernier slot est appelé.
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())
Donc ma question: y a-t-il un truc que j'ai raté quelque part ?
Merci à tous.
Partager