Bonjour à tous

J'ai remarqué que pour un QDialog, la touche "esc" le ferme sans le faire passer par un closeEvent

Exemple
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/usr/bin/env python3
# coding: utf-8
 
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import sys
 
class myWindow(QDialog):
	def __init__(self, *args, **kwargs):
		super().__init__(*args, *kwargs)
		btn=QPushButton("quit", parent=self, clicked=self.close)
		layout=QHBoxLayout(self)
		layout.addWidget(btn)
	# __init__()
 
	def closeEvent(self, event):
		print(
			"%s => %s.closeEvent(%s)" % (
				self.sender().__class__.__name__,
				self.__class__.__name__,
				"%s (%s)" % (event.__class__.__name__, type(event)),
			)
		)
 
		# Question
		if QMessageBox.question(
			self,
			"Confirmation",
			"Confirmez-vous vouloir quitter ?",
			QMessageBox.Yes|QMessageBox.No,
		) != QMessageBox.Yes:
			event.ignore()
			return
		# if
 
		# Appel méthode objet hérité
		super().closeEvent(event)
		event.accept()
	# closeEvent()
# class myWindow
 
app=QApplication(sys.argv)
d=myWindow()
d.show()
sys.exit(app.exec_())

On lance le programme, si on appuie sur "quit" ou la croix on passe par le closeEvent (et on a le choix de valider ou refuser). Mais si on appuie sur "esc" la fenêtre se ferme sans rien demander.

On peut bien entendu forcer le truc en rajoutant un keyPressEvent codé par exemple de cette façon
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
def keyPressEvent(self, event):
	print(
		"%s => %s.keyPressEvent(%s)" % (
			self.sender().__class__.__name__,
			self.__class__.__name__,
			"%s (%s)" % (event.__class__.__name__, type(event)),
		)
	)
	if event.key() == Qt.Key_Escape:
		self.close()
		return
	# if
	super().keyPressEvent(event)
# keyPressEvent()

Mais quelqu'un (tyrtamos?) sait-il si ce comportement est voulu (et pourquoi) ou bien s'il s'agit d'une erreur de conception dans Qt? Surtout que ça ne vaut que pour un QDialog. Pour un QWidget, la touche "Esc" est inactive.

Merci à tous