Les bogues de PyQt 4.8.3 et suivante
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:
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...