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 :

QTableView et calendrier


Sujet :

PyQt Python

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2013
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Décembre 2013
    Messages : 9
    Points : 8
    Points
    8
    Par défaut QTableView et calendrier
    bonjour,
    je suis toujours avec mon premier projet pyqt5, j'aimerai savoir si je peux ajouter à une cellule du tableview qui présente la date un clendrier popup ( quand je clique sur la colonne de la date un calendrier s'affiche pour changer la date )
    est ce qu'il y a une méthode "propre" ou je dois travailler sur le signal clicked() du tableview
    merci

  2. #2
    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 : 42
    Localisation : France, Loire (Rhône Alpes)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 456
    Points : 6 789
    Points
    6 789
    Billets dans le blog
    15
    Par défaut


    Citation Envoyé par Arkefi Voir le message
    est ce qu'il y a une méthode "propre" ou je dois travailler sur le signal clicked() du tableview
    merci

    Qu'est ce que tu ne trouves de pas "propre" avec clicked ?

    ++

    J
    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

  3. #3
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    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 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Les personnes qui débutent avec PyQt confondent souvent QTableView et QTableWidget. Je suppose qu'ici, c'est bien un QTableView dont on a besoin, c'est à dire de l'affichage de données par l'intermédiaire d'un modèle.

    Pour les données, j'ai choisi ici une simple liste de listes avec un QStandardItemModel comme modèle. Mais ça pourrait être aussi bien la table d'une base de données!

    Pour l'exemple, la 2ème colonne (indice 1) est faite de chaines de caractères qui représentent des dates sous la forme "aaaammjj" (ce qui permet facilement des tris chronologiques):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    data = [["a", "20150527", "d"], ["e", "20140215", "g"], ["h", "20151005", "j"]]
    Pour le reste, voici un petit code exemple (Python 3.4, PyQt5):

    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
    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
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
    # Python 3 PyQt5
     
    import sys, os
    from functools import partial
    from PyQt5 import QtCore, QtGui, QtWidgets
     
    #############################################################################
    class Fenetre(QtWidgets.QWidget):
     
        # =======================================================================
        def __init__(self, parent=None):
            super(Fenetre, self).__init__(parent)
            self.resize(300, 200)
     
            self.data = [["a", "20150527", "d"], ["e", "20140215", "g"], ["h", "20151005", "j"]]
     
            # crée le modèle de données
            self.model = QtGui.QStandardItemModel()
     
            # peuple le modèle
            for i, row in enumerate(self.data):
                for j, col in enumerate(row):
                    item = QtGui.QStandardItem()
                    item.setData(col, QtCore.Qt.DisplayRole)
                    self.model.setItem(i, j, item)
     
            # met les titres des colonnes
            headers = ['col1','col2','col3']
            for j, header in enumerate(headers):
                titrecol = QtGui.QStandardItem(header)
                self.model.setHorizontalHeaderItem(j, titrecol)
     
            # crée le QTableView
            self.tablevue = QtWidgets.QTableView(self)
            # connecte le QTableView au modèle de données
            self.tablevue.setModel(self.model)
            # ajuste la largeur des colonnes à leur contenu
            self.tablevue.resizeColumnsToContents()
            # exécutera la méthode donnée à chaque clic sur le QTableView
            self.tablevue.clicked.connect(self.clic_tablevue)
     
            # positionne le QTableView dans la fenêtre
            posit = QtWidgets.QGridLayout()
            posit.addWidget(self.tablevue, 0, 0)
            self.setLayout(posit)
     
        # =======================================================================
        def clic_tablevue(self, index):
            """exécuté à chaque clic sur le QTableView
            """
            if index.column() == 1:
                # => on a cliqué sur la colonne des dates (indice 1)
     
                # récup du contenu (str) de la case cliquée
                date = index.data() 
                # crée un QDate avec la date de la case cliquée 
                qdate = QtCore.QDate()
                qdate.setDate(int(date[:4]), int(date[4:6]), int(date[6:])) 
     
                # crée le calendrier
                self.cal = QtWidgets.QCalendarWidget()
                self.cal.setGridVisible(True)
                # prépare la sortie du calendrier (on passe index en plus!)
                self.cal.clicked.connect(partial(self.clic_cal, index))
                # initialise le calendrier avec la date de la case cliquée
                self.cal.setSelectedDate(qdate) 
                # affiche la fenêtre du calendrier
                self.cal.show()
     
        # =======================================================================
        def clic_cal(self, index, qdate):
            """exécuté à chaque clic sur une date du calendrier
            """
            # récupère la date sélectionnée sous forme de chaine
            date2 = "%4d%02d%02d" % (qdate.year(), qdate.month(), qdate.day())
            # modifie la donnée grâce au modèle
            self.tablevue.model().setData(index, date2)
            # et ferme la fenêtre du calendrier
            self.cal.close()
     
        # =======================================================================
        def keyPressEvent(self, event):
            if self.tablevue.hasFocus():
                if event.key() == QtCore.Qt.Key_X and (event.modifiers() & QtCore.Qt.AltModifier):
                    # récupére la liste data après modification
                    imax, jmax = self.tablevue.model().rowCount(), self.tablevue.model().columnCount()
                    data2 = []
                    for i in range(0, imax):
                        data2.append([]) # nouvelle ligne
                        for j in range(0, jmax):
                            item = self.tablevue.model().item(i,j)
                            elem = item.data(QtCore.Qt.DisplayRole)
                            data2[-1].append(elem)
                    print(data2)
                    event.accept()
                else:
                    event.ignore()
            else:
                event.ignore()
     
    #############################################################################
    if __name__ == '__main__':
        app = QtWidgets.QApplication(sys.argv)
        fen = Fenetre()
        fen.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        fen.show()
        sys.exit(app.exec_())
    A noter: j'ai ajouté un keyPressEvent qui récupère et affiche à chaque Alt-X les données de base dans leur état courant (c'est à dire après modifs). En effet, on ne peut pas lire simplement le data initial qui n'a pas changé, ni le simple contenu des cases comme si c'était un QTableWidget: il faut absolument passer par le modèle.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  4. #4
    Futur Membre du Club
    Inscrit en
    Décembre 2013
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Décembre 2013
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Qu'est ce que tu ne trouves de pas "propre" avec clicked ?



    j'ai plutot voulu dire une simple action ( instructions) pas besoin de bricoler et créer une fonction

Discussions similaires

  1. Utilisation d'un calendrier (Contrôle ActiveX)
    Par MultiClic dans le forum IHM
    Réponses: 40
    Dernier message: 12/07/2006, 15h11
  2. disparition activeX calendrier
    Par djool dans le forum Access
    Réponses: 10
    Dernier message: 26/01/2005, 12h31
  3. [toFAQ]calendrier perpetuel
    Par philippe_jasmin dans le forum C
    Réponses: 17
    Dernier message: 22/04/2003, 19h04
  4. Delphi et XMLRAD pour un calendrier
    Par Toxine77 dans le forum XMLRAD
    Réponses: 9
    Dernier message: 23/01/2003, 13h56
  5. Calcul des numéros de semaine d'un calendrier
    Par Invité dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 06/11/2002, 21h29

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