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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 49
    Par défaut Formater les données avant affichage dans un QTableView
    Hello,
    Comme l'indique le titre, je souhaite mettre en forme les données stockées dans une BDD SQLITE avant de les afficher dans un QTableView
    Dans la BDD, les dates sont stockées sous la forme yy-mm-dd et je veux les afficher au format français jj/mm/aa
    De même, pour les prix, j'ajouterai bien un "€" à chaque flottant
    j'ai également des valeurs binaires pour lesquelle j'afficherai bien des cases à cocher mais là j'ai vu qu'il fallait modifier le délégué -> ok, j'étudie ça à part

    Pour récupérer mes données, soit je fais appel à un QSqlTableModel ou un QSqlRelationalTableModel, soit à un QSqlQueryModel, ma question est la suivante :
    Pour formater mes données dans QTableView, faut-il modifier les délégués ou y-a-t-il une autre methode moins lourde ? ça me parait assez complexe pour quelques chaines de caractères.

    merci d'avance et bon dimanche
    Nicolas

  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Je fais ça avec un QStyledItemDelegate sous-classé, dont je surcharge la méthode paint.C'est un delegate à brancher sur le QTableView avec sa méthode setItemDelegate

    Selon l'index de la colonne, on peut présenter les entiers, les flottants ou les chaines comme on veut. Par exemple: afficher les flottants avec un nb de décimales fixes, mettre les nb négatifs en rouge, centrer les chaines et les mettre en gras+italique, etc...

    Je n'ai pas le temps de te proposer du code maintenant. Si tu n'as pas résolu le pb ce soir ou demain, je pourrais te donner un exemple.

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 49
    Par défaut
    merci pour ta réponse, je vais creuser le sujet du délégué, de prime abord, ça me parait assez chronophage, je ne voulais pas m'aventurer là-dessus sans être assuré du résultat.

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 49
    Par défaut
    bonjour,
    Je poursuis la personnalisation de l'affichage de mes données dans un QTableView. Grace à un delegate perso, je peux afficher le nom des mois au lieu de leur numéro et j'affiche un "€" dans les colonnes concernées. Jusque là tout va bien.
    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
     
    NUMMOIS, TOTALCREDITMOIS, TOTALDEBITMOIS, SOLDEMOIS = range(4)
    ListeMois = ("janvier", "février","mars", "avril", "mai", "juin", "juillet", "aout", "septembre", "octobre", "novembre", "décembre")
     
    class BilanDelegate(QStyledItemDelegate):
        def __init__(self, parent=None):
            super(BilanDelegate, self).__init__(parent)
     
        def paint(self, painter, option, index):
            painter.save() #sauve le contexte
            #afficher " €" dans les colonnes credit debit et solde
            if index.column() == TOTALCREDITMOIS or index.column() == TOTALDEBITMOIS or index.column() == SOLDEMOIS:
                montant = index.model().data(index) #string représentant la somme brute
                montant = "{} €".format(montant)
                painter.drawText(option.rect, Qt.AlignRight|Qt.AlignVCenter, montant)
            elif index.column() == NUMMOIS:
                nummois = index.model().data(index)
                if nummois >= 1 and nummois <= 12:
                    mois = ListeMois[nummois - 1]
                    painter.drawText(option.rect,Qt.AlignVCenter, mois)
                painter.restore()
            else:
                QStyledItemDelegate.paint(self, painter, option, index)
    A l'affichage, je constate que le symbole "€" est collé à la ligne séparatrice de la colonne, ce n'est pas très esthétique et j'aimerai ajouter une marge entre le texte affiché dans la cellule et le cadre.
    Nom : tableaubilan.png
Affichages : 3146
Taille : 49,1 Ko
    Y-a-t-il un moyen technique et plus élégant que de simplement ajouter un espace après le "€" ?
    J'ai essayé de travailler sur les dimensions du option.rect mais j'obtiens des résultats aberrants
    merci

  5. #5
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Puisqu'il s'agit d'un traitement pour l'affichage, il devrait suffire d'ajouter un espace après le "€" dans la méthode paint du delegate.

    J'ai déjà fait un truc plus musclé qui consiste à placer le widget d'affichage de type QLineEdit dans un widget QWidget qui est lui-même inséré dans chaque case du QTableView, afin de pouvoir reconstruire des marges d'affichage qui ne sont pas prévues au départ. Mais c'est vraiment plus compliqué! Il faut construire à part ce widget composite et, dans le delegate, il faut en faire l'insertion en surchargeant la méthode createEditor. Si on veut en plus prendre en compte des modifications faites par l'utilisateur, il faut aussi surcharger les méthodes setEditorData (pour l'édition) et setModelData (pour l'enregistrement des modifications). Ceci en plus du paint pour l'affichage. Bref, ça devient une belle usine à gaz... Mais c'est possible!

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 49
    Par défaut
    merci pour ton retour détaillé,
    donc les marges n'existent pas dans les cellules d'un QTableView. Mais cette propriété existe pour un QLineEdit, c'est bon à savoir.
    Comme souvent, il faut faire simple, je reste sur l'ajout de l'espace, ça répond à mon besoin.
    bonne journée!

+ Répondre à la discussion
Cette discussion est résolue.

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