Bonsoir

Juste pour vous informer qu'aujourd'hui je me suis pris la tête avec un QTextEdit qui, quand on appuie sur la touche "backspace", envoie 2 signaux "textEdited()".

J'avais déjà ouvert un topic à propos du removeItemWidget() qui ne fonctionne plus en PyQt v4.8.4 et 4.8.5 (http://www.developpez.net/forums/d11...rsion-suivante et là, je trouve ce pb sur PyQt v4.8.3...

Ca m'a pris la tête parce que je récupère ce signal dans un objet appelant qui, quand la zone devient vide, supprime un élément d'un dictionnaire. Bien évidemment, interceptant 2 signaux, je tente de supprimer 2 fois mon élément ce qui fait un peu bugguer le truc. Et avant de trouver la cause réelle du pb...

Pour ceux qui veulent tester le truc, voici un petit code test
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
 
class QtAppli(QApplication):
	"Fenêtre de l'application"
 
	# Constructeur fenêtre
	def __init__(self,
			argv):
 
		# Message de contrôle
		print "QtAppli (qt v%s, pyqt_v%s)" % (QT_VERSION_STR, PYQT_VERSION_STR)
 
		# Appel constructeur de l'objet hérité
		QApplication.__init__(self, argv)
 
		# Attributs de l'application
		self.argv=argv
 
		# Widget principale
		self.__mainWid=QMainWindow()
		self.__mainWid.setCentralWidget(QWidget(self.__mainWid))
		self.__mainWid.statusBar()
 
		# Titre
		self.__mainWid.setWindowTitle("Test qtextedit")
 
		# Version
		self.__mainWid.statusBar().showMessage(
			"Qt v%s, PyQt v%s" % (
				QT_VERSION_STR,
				PYQT_VERSION_STR,
			)
		)
 
		# Un espace de rangement général
		mainLayout=QHBoxLayout(self.__mainWid.centralWidget())
 
		# Le textedit
		self.__tabItem=[]
		self.__textEdit=QTextEdit()
		self.connect(self.__textEdit, SIGNAL("textChanged()"), self.__slotEdited)
 
		# La zone des boutons
		layoutBtn=QVBoxLayout()
 
		# Pour quitter
		quit=QPushButton()
		quit.setText("Quitter")
		self.connect(quit, SIGNAL("clicked()"), self.__mainWid, SLOT("close()"))
 
		# Rangement des boutons
		layoutBtn.addWidget(quit)
 
		# Rangement général
		mainLayout.addWidget(self.__textEdit)
		mainLayout.addLayout(layoutBtn)
	# __init__()
 
	# Le slot appelé quand le texte change
	def __slotEdited(self):
		# Petit message dans la console
		print "edite [%s] (%d)" % (self.__textEdit.toPlainText(), len(self.__textEdit.toPlainText()))
 
		# Popup
		QMessageBox.information(
			self.__mainWid.centralWidget(),
			QString.fromUtf8("Texte modifié"),
			QString.fromUtf8(
				"Contenu de la zone: [%s]\n" % self.__textEdit.toPlainText()
				+ "Taille saisie: [%d]" % len(self.__textEdit.toPlainText())
			),
			QMessageBox.Ok,
		)		
	# __slotEdited()
 
	# Affichage et lancement application
	def run(self):
		self.__mainWid.show()
		self.exec_()
	# run()
# class QtAppli
 
Appli=QtAppli(sys.argv)
Appli.run()

Donc celui qui voudra tester verra. Tant qu'il entre des caractères tout va bien. Il a une popup pour chaque caractère entré.
Mais si on supprime un caractère via la touche backspace, alors on a 2 popups qui montrent que le slotEdited() a été appelé 2 fois !!!

Pour info j'ai fait ce soir test sur Windows sur lequel j'ai installé, pour l'occasion, PyQt 4.8.5. Toutefois j'étais jusqu'à présent sur PyQt v4.5.4 (cause PyQwt) et je n'avais pas ce souci avec cette vieille version.

Donc si je récapitule les pb de PyQt 4.8, il y a le removeWidgetItem et ce signal textChanged() de trop.

Si qqun avait un avis (une info) sur le sujet...