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 :

QTableWidget : span de cellule à la souris


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Août 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 41
    Par défaut QTableWidget : span de cellule à la souris
    Bonjour,

    Je fais une petite appli affichant des données dans un QTableWidget.
    Je cherche à faire en sorte qu'on puisse, à la souris, 'saisir' le coté d'une cellule et l'entendre aux cellule d'à coté. Seulement en horizontale, je prend la droite d'une cellule pour l’étendre à droite, et la gauche pour l'étendre à gauche.
    Je pense qu'il va falloir changer le comportement du clic, détecter si on est à +ou- x pixels du bord, et ainsi appeler une autre fonction (.setSpan()), mais si qqlun à une idée ou peu m'aiguiller ce serai super.
    Merci
    Kib

  2. #2
    Expert confirmé

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

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

    Tu réimplémentes le mousePressEvent() et tu utilises le signal clicked(), ça marche.

    Exemple, ici j'ai utilisé un script que j'ai sous le coude donc il s'agit d'une classe qui hérite de QTableView, tu devras peut-être adapter à ton contexte:
    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
     
    class MyTable(QTableView):
        def __init__(self):
            ...
            self.clicked.connect(self.on_cell_clicked)
     
        def mousePressEvent(self, event):
            self.clicked_at = event.pos()
            QtGui.QTableView.mousePressEvent(self, event)
     
        def on_cell_clicked(self, idx):
            col = idx.column()
            col_begin = self.columnViewportPosition(col)
            col_end = col_begin + self.columnWidth(col)
            print 'Clicked column:', col, 'at:', self.clicked_at
            print 'Bord gauche:', col_begin, 'bord droit:', col_end

  3. #3
    Membre averti
    Inscrit en
    Août 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 41
    Par défaut
    Merci de me mettre sur la route

    Par contre ma table n'est pas une class QTableView, je la crée dans une class QtGui.QWidget pour la mettre dans la layout (layout qui aura aussi des boutons etc en plus de la table). Du coup le mousePressEvent n'est pas déclenché, donc le self.clicked_at non plus.

    J'ai essayé de simplifier le code au max, il fonctionne tel quel avec le msg d'erreur:

    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
     
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    import sys
    from PyQt4 import QtGui, QtCore
     
     
     
    class MainWindows(QtGui.QWidget):
        def __init__(self):
            QtGui.QWidget.__init__(self)
            self.setGeometry(300, 150, 1140, 630)
            self.GridLayout = QtGui.QGridLayout()
            self.setLayout(self.GridLayout)
     
            self.GridLayout.addWidget(QtGui.QLabel("some stuff...", self), 0, 0)
     
            self.buildTable()
            self.show()
        #
        def buildTable(self):
            self.table = QtGui.QTableWidget(10, 10)
            self.GridLayout.addWidget(self.table, 1, 0, 20, 20)
     
            #click reimplemanted:
            self.table.clicked.connect(self.on_cell_clicked)
        #
        def mousePressEvent(self, event):
            print "mousePressEvent"
            self.clicked_at = event.pos()
            print "clicked_at:", event.pos()
            self.table.mousePressEvent(self.table, event)
        #
        def on_cell_clicked(self, idx):
            col = idx.column()
            row = idx.row()
            col_begin = self.table.columnViewportPosition(col)
            col_end = col_begin + self.table.columnWidth(col)
            print 'Clicked column:', col, "row:", row, 'at:', self.clicked_at
            print 'Bord gauche:', col_begin, 'bord droit:', col_end
        #
    #
    def main():
        global MainWin
        app = QtGui.QApplication(sys.argv)
        MainWin = MainWindows()
        sys.exit(app.exec_())
    #
    if __name__ == '__main__':
        main()

  4. #4
    Membre averti
    Inscrit en
    Août 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 41
    Par défaut
    Bon, la meme chose avec deux class, qui marche:
    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
     
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    import sys
    from PyQt4 import QtGui, QtCore
     
    class PlanningTable(QtGui.QTableWidget):
        def __init__(self, parent):
            QtGui.QTableWidget.__init__(self, parent)
            self.clicked.connect(self.on_cell_clicked)
        #
        def mousePressEvent(self, event):
            self.clicked_at = event.pos()
            QtGui.QTableView.mousePressEvent(self, event)
        #
        def on_cell_clicked(self, idx):
            col = idx.column()
            row = idx.row()
            clicx = self.clicked_at.x()
            col_begin = self.columnViewportPosition(col)
            col_end = col_begin + self.columnWidth(col)
            print 'Clicked column:', col, "row:", row
            print 'Bord gauche:', col_begin, 'bord droit:', col_end
            print 'clic x: ', clicx
     
            if clicx < col_begin+10:
                print 'strech left !'
                self.setSpan(row, col-1, 1, 2)
            elif clicx > col_end-10:
                print 'strech right !'
                self.setSpan(row, col, 1, 2)
        #
    class MainWindows(QtGui.QWidget):
        def __init__(self):
            QtGui.QWidget.__init__(self)
            self.setGeometry(300, 150, 1140, 630)
            self.GridLayout = QtGui.QGridLayout()
            self.setLayout(self.GridLayout)
     
            self.GridLayout.addWidget(QtGui.QLabel("some stuff...", self), 0, 0)
     
            self.table = PlanningTable(self)
            self.nbrow, self.nbcol = 10, 10
            self.table.setRowCount(self.nbrow)
            self.table.setColumnCount(self.nbcol)
     
            self.GridLayout.addWidget(self.table, 1, 0, 20, 20)
            self.show()
        #    
    #
    def main():
        global MainWin
        app = QtGui.QApplication(sys.argv)
        MainWin = MainWindows()
        sys.exit(app.exec_())
    #
    if __name__ == '__main__':
        main()
    Par contre, de ce que je comprend, l'event est déclenché quand on relève le doigt (au mouseUP en fait), pas au mouseDOWN. J'ai mis un setSpan au clic du coup, mais comment le fait sans relâcher la souris en visualisant le truc ?
    Après, reste à détecter si la cellule est déjà spannée pour adapter les coordonnées des bords, là je vois comment faire.

  5. #5
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Pour répondre à ton post antérieur, il faut réassigner le mousePressEvent à l'objet que tu crées, donc avec tes lignes de code, ça donne ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        def buildTable(self):
            self.table = QtGui.QTableWidget(10, 10)
            self.GridLayout.addWidget(self.table, 1, 0, 20, 20)
            self.table.mousePressEvent = self.mousePressEvent
    Évidemment, si tu veux réimplémenter plusieurs mousePressEvent pour différents widgets, il faudra changer le nom de la fonction.

    Pour ton dernier post, c'est le signal qui est émit après relâchement du bouton, d'ailleurs il s'appelle "clicked" pour cette raison là, pour l'event c'est bien à la pression du bouton qu'il réagit.

    Il existe aussi un mouseReleaseEvent() si besoin.

  6. #6
    Membre averti
    Inscrit en
    Août 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 41
    Par défaut
    ok pigé, merci Je vais tricoter avec çà.

Discussions similaires

  1. rendre une cellule plus claire au passage de la souris
    Par pierrot10 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 02/08/2006, 09h29
  2. Réponses: 5
    Dernier message: 30/03/2006, 11h59
  3. appliquer une couleur au passage souris sur grpe de cellules
    Par mathieu_r dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 26/01/2006, 14h20
  4. Coordonnées souris -> cellule de tKstringgrid
    Par qi130 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 01/12/2005, 23h16
  5. Réponses: 8
    Dernier message: 14/03/2005, 21h43

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