IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PyQt Python Discussion :

Problème avec QTreeWidget.removeItemWidget PyQt 4.8.4 et version suivante


Sujet :

PyQt Python

  1. #1
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 814
    Billets dans le blog
    1
    Par défaut Problème avec QTreeWidget.removeItemWidget PyQt 4.8.4 et version suivante
    Bonjour à tous

    J'ai un problème avec QTreeWidget.removeItemWidget qui s'est déclaré avec PyQt v4.8.4 et qui perdure avec PyQt v4.8.5. Jusqu'à présent le removeItemWidget fonctionnait nickel et depuis 4.8.4 il ne fonctionne plus

    J'ai écrit un petit code test tout simple: un QTreeWidget avec un bouton "+" pour ajouter des item et un bouton "-" pour supprimer le dernier item

    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
    90
    91
    92
    93
    94
    95
    96
    97
    #!/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értié
    		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 qtreewidget")
     
    		# 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())
     
    		# La zone d'items et son scroll
    		self.__tabItem=[]
    		self.__treeItem=QTreeWidget()
     
    		# La zone des boutons
    		layoutBtn=QVBoxLayout()
     
    		# Les boutons + et -
    		self.__add=QPushButton("+")
    		self.connect(self.__add, SIGNAL("clicked()"), self.__addItem)
    		self.__sub=QPushButton("-")
    		self.__sub.setEnabled(False)
    		self.connect(self.__sub, SIGNAL("clicked()"), self.__subItem)
    		for i in range(10): self.__addItem()
     
    		# Pour quitter
    		quit=QPushButton()
    		quit.setText("Quitter")
    		self.connect(quit, SIGNAL("clicked()"), self.__mainWid, SLOT("close()"))
     
    		# Rangement des boutons
    		layoutBtn.addWidget(self.__add)
    		layoutBtn.addWidget(self.__sub)
    		layoutBtn.addWidget(quit)
     
    		# Rangement général
    		mainLayout.addWidget(self.__treeItem)
    		mainLayout.addLayout(layoutBtn)
    	# __init__()
     
    	# Ajout d'élément
    	def __addItem(self):
    		print "add %d" % len(self.__tabItem)
    		self.__tabItem.append(QTreeWidgetItem(QStringList(QString("Hello %d" % len(self.__tabItem)))))
    		self.__treeItem.addTopLevelItem(self.__tabItem[-1])
    		self.__sub.setEnabled(True)
    	# __addItem
     
    	# Suppression d'élément
    	def __subItem(self):
    		print "sub %d" % len(self.__tabItem)
    		self.__treeItem.removeItemWidget(self.__tabItem[-1], 0)
    		del self.__tabItem[-1]
    		if len(self.__tabItem) == 0: self.__sub.setDisabled(True)
    	# __subItem
     
    	# Affichage et lancement application
    	def run(self):
    		self.__mainWid.show()
    		self.exec_()
    	# run()
    # class QtAppli
     
    Appli=QtAppli(sys.argv)
    Appli.run()

    Ce code fonctionne à la perfection avec PyQt jusqu'à 4.8.3 mais ne fonctionne plus avec 4.8.4 et 4.8.5 (le dernier à ce jour). J'arrive bien à ajouter des item mais la méthode remove ne fonctionne plus.

    Donc j'aimerais bien avoir les avis des connaisseurs savoir si qqun a rencontré le même souci, ou alors si la façon de faire a changé...

    Merci à tous.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 304
    Par défaut
    Salut,

    Tout l'air d'un bug, tu as fait une recherche là:

    https://bugreports.qt.nokia.com

    Perso je n'arrive pas à faire tourner cette version de PyQt, sous debian le paquet a l'air foireux, donc je ne sais pas tester.

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 814
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Salut,

    Tout l'air d'un bug, tu as fait une recherche là:

    https://bugreports.qt.nokia.com
    Je viens d'aller taper rapidement removeItemWidget dans le moteur de recherche => rien.

    Accessoirement, j'ai examiné le code source de PyQt 4.8.3 et 4.8.5 pour la fonction removeItemWidget.
    Voici les différences (merci à meld)

    Version 4.8.3
    Code c : 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
    extern "C" {static PyObject *meth_QTreeWidget_removeItemWidget(PyObject *, PyObject *);}
    static PyObject *meth_QTreeWidget_removeItemWidget(PyObject *sipSelf, PyObject *sipArgs)
    {
        PyObject *sipParseErr = NULL;
    
        {
            QTreeWidgetItem * a0;
            int a1;
            QTreeWidget *sipCpp;
    
            if (sipParseArgs(&sipParseErr, sipArgs, "BJ<i", &sipSelf, sipType_QTreeWidget, &sipCpp, sipType_QTreeWidgetItem, &a0, &a1))
            {
                Py_BEGIN_ALLOW_THREADS
                sipCpp->removeItemWidget(a0,a1);
                Py_END_ALLOW_THREADS
    
                Py_INCREF(Py_None);
                return Py_None;
            }
        }
    
        /* Raise an exception if the arguments couldn't be parsed. */
        sipNoMethod(sipParseErr, sipName_QTreeWidget, sipName_removeItemWidget, doc_QTreeWidget_removeItemWidget);
    
        return NULL;
    }

    Version 4.8.4 et 4.8.5
    Code c : 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
    extern "C" {static PyObject *meth_QTreeWidget_removeItemWidget(PyObject *, PyObject *);}
    static PyObject *meth_QTreeWidget_removeItemWidget(PyObject *sipSelf, PyObject *sipArgs)
    {
        PyObject *sipParseErr = NULL;
    
        {
            QTreeWidgetItem * a0;
            int a1;
            QTreeWidget *sipCpp;
    
            if (sipParseArgs(&sipParseErr, sipArgs, "BJ8i", &sipSelf, sipType_QTreeWidget, &sipCpp, sipType_QTreeWidgetItem, &a0, &a1))
            {
            // We have to break the association with any existing widget.
            QWidget *w = sipCpp->itemWidget(a0, a1);
            
            if (w)
            {
                PyObject *wo = sipGetPyObject(w, sipType_QWidget);
            
                if (wo)
                    sipTransferBreak(wo);
            }
            
            Py_BEGIN_ALLOW_THREADS
            sipCpp->removeItemWidget(a0, a1);
            Py_END_ALLOW_THREADS
    
                Py_INCREF(Py_None);
                return Py_None;
            }
        }
    
        /* Raise an exception if the arguments couldn't be parsed. */
        sipNoMethod(sipParseErr, sipName_QTreeWidget, sipName_removeItemWidget, doc_QTreeWidget_removeItemWidget);
    
        return NULL;
    }
    J'ai bien envie de remettre la fonction 4.8.3 à la place de la 4.8.5 histoire de voir mais ça me gonfle car la compil dure 25mn. Peut-être demain si j'ai le temps...

    Citation Envoyé par VinsS Voir le message
    Perso je n'arrive pas à faire tourner cette version de PyQt, sous debian le paquet a l'air foireux, donc je ne sais pas tester.
    Je suis aussi sous Debian (lenny) mais perso je préfère compiler Qt, sip et PyQt plutôt que d'utiliser les paquets...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 304
    Par défaut
    Je viens d'installer Archlinux sur mon portable donc j'ai repensé à ton code.

    Je confirme, ça ne fonctionne pas.

    Qt v4.7.2, PyQt v4.8.4

    Pareil avec Python v2.7 et v3.2.1

  5. #5
    Rédacteur/Modérateur

    Avatar de Jiyuu
    Homme Profil pro
    Développeur amateur
    Inscrit en
    Janvier 2007
    Messages
    2 456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur amateur
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 456
    Billets dans le blog
    15
    Par défaut
    Je viens de faire le test sous Win XP, Python 2.7, Qt 4.7.2 et PyQt 4.8.4...

    Je constate que l'ajout fonctionne bien. La suppression à moitié.
    Explication : Au début j'ai "Hello 0" à "Hello 9". Si j'en supprime un rien ne se passe visuellement, par contre si j'en rajoute un par la suite, c'est bien un "Hello 9" qui s'affiche.

    Est-ce le même souci que tu as?

    À noter que toujours sous windows avec Python 3.2, Qt 4.7.2 et PyQt 4.8.4 le problème est le même.
    Initiation à Qt Quick et QML : Partie 1 - Partie 2
    En cas de besoin, pensez à la
    Mon site et mes tutoriaux sur Developpez.com
    Pas de question technique par MP... Les forums sont là pour ça

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 814
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Jiyuu Voir le message
    Je viens de faire le test sous Win XP, Python 2.7, Qt 4.7.2 et PyQt 4.8.4...

    Je constate que l'ajout fonctionne bien. La suppression à moitié.
    Explication : Au début j'ai "Hello 0" à "Hello 9". Si j'en supprime un rien ne se passe visuellement, par contre si j'en rajoute un par la suite, c'est bien un "Hello 9" qui s'affiche.

    Est-ce le même souci que tu as?
    Bonsoir

    Oui c'est bien ça. Et ce qui s'affiche dans la fenêtre de retour est normal car c'est juste le contenu de self.__tabItem.
    Quand tu appuies sur "-" le dernier élément est effacé del self.__tabItem[-1] et quand tu appuies sur "+" la chaine "Hello[n]" vient se mettre dans le dernier élément du tableau, n étant le nombre d'éléments dudit tableau. Donc quand tu appuies sur "-" le nb d'éléments de tabItem passe de 10 à 9 et donc forcément quand tu appuies sur "+", c'est la chaine "Hello9" qui vient se mettre en fin de tableau.

    Mais le pb ne vient pas de tabItem et de son contenu qui n'est en fait qu'un bête tableau mais du fait que l'item ne disparait pas du QTreeWidget !!! Or la fonction removeItemWidget() est sensé le faire disparaitre (enfin c'est ce qu'elle faisait jusqu'à présent !!!)

    Citation Envoyé par Jiyuu Voir le message
    À noter que toujours sous windows avec Python 3.2, Qt 4.7.2 et PyQt 4.8.4 le problème est le même.
    Hum, moi sous windows suis un peu en retard (Python 2.6, Qt 4.5.2 et PyQt 4.5.4) mais là tout va bien.

    J'ai envoyé un mail à la mailing list de PyQt. On va bien voir...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. PyQt 5 Problème avec slot personnalisé
    Par gaut5 dans le forum GUI
    Réponses: 7
    Dernier message: 16/08/2014, 19h33
  2. problème avec bibliothèque smtplib et pyqt
    Par tariktrk dans le forum Général Python
    Réponses: 2
    Dernier message: 07/01/2012, 23h17
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo