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 :

Formater les données avant affichage dans un QTableView


Sujet :

PyQt Python

  1. #21
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 726
    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 726
    Points : 31 046
    Points
    31 046
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par tyrtamos Voir le message
    - la "moulinette" de Sve@r pour passer de PyQt5 à PyQt6:
    https://www.developpez.net/forums/d2...t5-vers-pyqt6/
    Malheureusement ma "moulinette" ne traite que les éléments que j'ai déjà repérés... et l'élément "QFrame.box" n'en fait pas (encore) partie.

    Fort heureusement il y a aussi une autre "moulinette" (find_qt6) qui a un usage différent : on lui passe un élément Qt5 et il cherche tous les éléments Qt6 qui ont le même nom.

    Voici l'autre moulinette
    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
    #!/usr/bin/env python3
    # coding: utf-8
     
    from PyQt6.QtCore import *
    from PyQt6.QtGui import *
    from PyQt6.QtWidgets import *
     
    def find(n, s):
    	try:
    		for attrib in dir(eval(n)):
    			sss="%s.%s" % (n, attrib)
    			try:
    				for name in eval(sss)._member_names_:
    					if s.lower() in name.lower():
    						yield "%s.%s" % (sss, name)
    				# for
    			except AttributeError: pass
    		# for
    	except NameError: pass
    # find()
     
    import sys
    for q in sys.argv[1:]:
    	if "." not in q: continue
    	if f:=tuple(find(*q.split("."))):
    		print("%s (Qt5)" % q)
    		for x in f: print("\t%s (Qt6)" % x)
    	else: print("%s (Qt5): None" % q)
    	print()
    # for
    En l'appelant et en lui donnant "QFrame.box" il répond "QFrame.Shape.Box".

    Donc en reprenant le code et en remplaçant tous les "xxx.box" par "xxx.Shape.box" (sans oublier aussi les "self.box" de l'objet "CheckBox" qui hérite d'un QFrame) et ça fonctionne nickel.

    Et pour ma "moulinette" il suffit de rajouter le tuple ("box", "Shape.box") à la clef "QFrame" du dictionnaire "translate" et elle sera désormais capable de faire ça automatiquement (à l'exception des objets qui en héritent et dont l'accès se fait par "self" et qui donc ne sont malheureusement pas vus et donc pas traités). Je viens de la mettre à jour en ce sens.

    Citation Envoyé par tyrtamos Voir le message
    pour autant que j'y passe un jour
    Course de la reine rouge: quand tu n'auras plus de lib compatible PyQt5 il faudra bien que tu t'adaptes (et moi aussi)

  2. #22
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 480
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 480
    Points : 9 280
    Points
    9 280
    Billets dans le blog
    6
    Par défaut
    Bonjour Sve@r

    Citation Envoyé par Sve@r Voir le message
    Fort heureusement il y a aussi une autre "moulinette" (find_qt6) qui a un usage différent : on lui passe un élément Qt5 et il cherche tous les éléments Qt6 qui ont le même nom.
    Bravo pour la solution!

    quand tu n'auras plus de lib compatible PyQt5 il faudra bien que tu t'adaptes (et moi aussi)
    Oui, je sais. Je repousse de jour en jour parce que je n'ai pas un très bon souvenir du passage PyQt4 => PyQt5. J'avais fait aussi une "moulinette", mais il restait pas mal de travail à faire à la main, et ça concernait plusieurs centaines de fichiers... C'est d'ailleurs pour ça que j'avais créé un programme de "recherche-remplacement" multifichiers dont la dernière mouture est:
    https://www.developpez.net/forums/d2.../#post11977809.

  3. #23
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 207
    Points : 4 682
    Points
    4 682
    Par défaut
    bonjour
    Citation Envoyé par tyrtamos Voir le message
    Je repousse de jour en jour parce que je n'ai pas un très bon souvenir du passage PyQt4 => PyQt5.
    Ici, rien d'aussi compliqué, le principal travail est sur les CONSTANTES :
    qt6 passe les constantes en ENUM donc, à beaucoup d'endroits, il faut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    qt5: truc.CONSTANTE
    qt6: truc.ClassEnumMachin.CONSTANTE
    doc du problème courant est claire
    PySide6.QtWidgets.QFrame.Shape
    (hérite de enum.IntEnum) Ce type d'énumération définit les formes de cadre disponibles.
    QFrame, même chose pour .Shadow et .StyleMask qui sont les nouveaux enum
    Voir aussi la doc C


    ---------
    Hors les enum, les différences sont anecdotiques : https://www.pythonguis.com/faq/pyqt5-vs-pyqt6/

  4. #24
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 49
    Points : 51
    Points
    51
    Par défaut
    Merci Tyrtamos d'avoir pris le temps de me répondre,
    Je vais me replonger dans la doc de Qt6.
    bonne journée

  5. #25
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 726
    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 726
    Points : 31 046
    Points
    31 046
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par nicolassar Voir le message
    Merci Tyrtamos d'avoir pris le temps de me répondre,
    Ouais, de rien !!!

  6. #26
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 480
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 480
    Points : 9 280
    Points
    9 280
    Billets dans le blog
    6
    Par défaut
    Bonjour nicolassar

    Citation Envoyé par nicolassar Voir le message
    Merci Tyrtamos d'avoir pris le temps de me répondre
    Regarde aussi les autres réponses qui sont meilleures que la mienne, en particulier celle de Sve@r.

  7. #27
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 49
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Ouais, de rien !!!
    Toutes mes excuses, @Sve@r, je n'ai pas vu les messages suivant celui de Tyrtamos.
    Merci pour la moulinette et les explications, je vais regarder ça.

  8. #28
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 49
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par papajoker Voir le message
    bonjour

    Ici, rien d'aussi compliqué, le principal travail est sur les CONSTANTES :
    qt6 passe les constantes en ENUM donc, à beaucoup d'endroits, il faut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    qt5: truc.CONSTANTE
    qt6: truc.ClassEnumMachin.CONSTANTE
    doc du problème courant est claire

    QFrame, même chose pour .Shadow et .StyleMask qui sont les nouveaux enum
    Voir aussi la doc C


    ---------
    Hors les enum, les différences sont anecdotiques : https://www.pythonguis.com/faq/pyqt5-vs-pyqt6/
    Merci pour l'explication, le principe est clair, c'est la mise en pratique qui me pose problème . mais je vais y arriver avec les moulinettes proposées

  9. #29
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 726
    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 726
    Points : 31 046
    Points
    31 046
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par nicolassar Voir le message
    Toutes mes excuses, @Sve@r, je n'ai pas vu les messages suivant celui de Tyrtamos.
    Je comprends, tu n'avais pas rafraichi la page (ça m'arrive aussi). Et puis euh... il y a aussi le message de papajoker...

  10. #30
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 49
    Points : 51
    Points
    51
    Par défaut
    merci à tous, j'ai réussi à faire fonctionner le code, ouf
    pour info, je porte du PyQt4 vers PyQt6, sans passer par PyQt5, à la main, je ne connaissais pas jusqu'ici les moulinettes.
    Globalement, mon appli fonctionne et ce sont quelques petits trucs comme ce checkbox qui ne fonctionnent pas correctement.

    Il y a un truc qui me travaille encore, je n'ai pas bien compris cette partie :

    En pyqt4, je comprends que cette ligne crée un objet "box" du type QtWidgets.QCheckBox
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     self.box = QtWidgets.QCheckBox(self)
    En pyqt6, que fait la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     self.Shape.box = QtWidgets.QCheckBox(self)
    précisement ?
    Shape est de type enum, donc ça ajoute un enum de type QCheckBox à Shape ?

  11. #31
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 726
    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 726
    Points : 31 046
    Points
    31 046
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par nicolassar Voir le message
    pour info, je porte du PyQt4 vers PyQt6, sans passer par PyQt5, à la main, je ne connaissais pas jusqu'ici les moulinettes.
    Bah ce sont juste des trucs persos qu'on fait pour s'aider, rien de bien transcendant. Mais passer de Qt4 à Qt6 ça va piquer les yeux.

    Citation Envoyé par nicolassar Voir le message
    En pyqt4, je comprends que cette ligne crée un objet "box" du type QtWidgets.QCheckBox
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     self.box = QtWidgets.QCheckBox(self)
    Non. Ca ne crée pas un objet "box", ça instancie un objet QCheckBox que ça stocke dans l'attribut "box" de l'objet courant. C'est comme si tu avais écrit self.box=int(123).

    Citation Envoyé par nicolassar Voir le message
    En pyqt6, que fait la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     self.Shape.box = QtWidgets.QCheckBox(self)
    précisement ?
    Pareil, sauf que l'attribut "box" a été déporté dans un sous-objet "Shape".

  12. #32
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 207
    Points : 4 682
    Points
    4 682
    Par défaut
    En fait, tu ne comprends rien à ton code ???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class CheckBox(QtWidgets.QFrame):
        """QCheckBox placé dans un QFrame"""
        def __init__(self, parent=None):
            super().__init__(parent)
            # crée le QChecBox à l'intérieur du QFrame
            self.box = QtWidgets.QCheckBox(self)
     
    ...
    editor = CheckBox(parent)
    donc :
    editor est un QFrame
    editor.box est le QCheckBox

    NOTE: "QCheckBox placé dans un QFrame" très trompeur ! c'est un "QFrame qui contient un QCheckBox"

    En pyqt6, que fait la ligne
    self.Shape.box = QtWidgets.QCheckBox(self)
    Du grand n'importe quoi (Qt4..Qt6)

    editeur.Shape.box est une constante existante (dans tout QFrame)
    Il n'y a aucune raison de placer ici cette référence à ton QCheckBox, sinon désirer des problèmes

    Et je soupçonne que tu n'utilises jamais editeur.Shape donc ne devrait jamais être présent dans ton code

  13. #33
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 49
    Points : 51
    Points
    51
    Par défaut
    Bonjour,
    @Sve@r, merci, je comprends mieux

    @papajoker, je dirais plutot que je ne comprends pas tout, c'est pour ça que je pose des questions, je ne suis qu'un programmeur du dimanche, c'est devenu un loisir pour moi
    je ne comprends pas quand tu dis
    editeur.Shape.box est une constante existante (dans tout QFrame)
    box est bien un attribut (que j'ai créé) de QFrame, qui contient une instance de QCheckbox ? il faut bien que je le renseigne.
    n'est-ce pas ce que fait la ligne self.Shape.box = QtWidgets.QCheckBox(self) ?

  14. #34
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 207
    Points : 4 682
    Points
    4 682
    Par défaut
    Citation Envoyé par nicolassar Voir le message
    n'est-ce pas ce que fait la ligne self.Shape.box = QtWidgets.QCheckBox(self) ?
    Désolé il y a aussi de la confusion chez moi (.box n'est pas .Box)

    Il faut surtout que tu oublies .Shape !
    Ici, c'est la construction objet, pourquoi placer un attribut dans un autre attribut qui n'a rien à voir ?

    Comme toujours, si on a des doutes, il faut penser à faire un script de tests, exemple
    Code : 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
    from PyQt6 import QtWidgets
     
    class CheckBox(QtWidgets.QFrame):
        def __init__(self, parent=None):
            super().__init__(parent)
            self.boite = QtWidgets.QCheckBox(self)
            self.Shape.boite = (
                "completement inutile",
                QtWidgets.QCheckBox(self)
            )
     
    app = QtWidgets.QApplication([])
     
    test = CheckBox()
    # aucun intéret
    print("Qframe.Shape", test.Shape, [i for i in test.Shape])
    print("Qframe.Shape.Box", test.Shape.Box)
    # A oublier
     
    # mes divers tests pour comprendre ..
    print("Qframe", type(test), [k for k in vars(test.Shape) if not k.startswith("_")])
    print(".boite", test.boite)
     
    print(".Shape.boite", test.Shape.boite)
    #... suite de mes tests ...
    Tu peux noter mes print(...), c'était la première chose à faire lors de ton erreur : afficher les datas pour avoir une première chance de comprendre d'où peut venir l'erreur. Ensuite, parfois on passe au mini test de compréhension des choses comme en haut.
    Si ce "travail" (de print) n'est pas fait, alors le reste n'est qu'une grosse spéculation

  15. #35
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 726
    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 726
    Points : 31 046
    Points
    31 046
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par papajoker Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class CheckBox(QtWidgets.QFrame):
        def __init__(self, parent=None):
            super().__init__(parent)
    Attention à l'héritage. "parent" n'est pas le seul paramètre d'un QFrame. Et même s'il l'est aujourd'hui, il peut ne pas l'être demain...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class CheckBox(QtWidgets.QFrame):
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
    ... et ça c'est universel

  16. #36
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 49
    Points : 51
    Points
    51
    Par défaut
    Merci à tous pour ces précisions,
    J'avais complètement oublié l'usage du print, je voulais absolument utiliser le pas à pas pour résoudre ce truc...

    Je passe le sujet en résolu.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [MySQL] Recuperer les champs avant insertion dans la base de données.
    Par jmtrivia dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 23/04/2014, 15h00
  2. Réponses: 2
    Dernier message: 24/05/2013, 16h04
  3. Réponses: 2
    Dernier message: 30/10/2006, 22h14
  4. Réponses: 4
    Dernier message: 04/12/2003, 08h12
  5. Réponses: 4
    Dernier message: 18/08/2003, 09h53

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