Bonjour
je souhaite récupérer la ligne et la colonne d'une cellule dans une tableau ,
lorsque je clique sur une cellule j'affiche sa position (ligne , colonne)
merci
Bonjour
je souhaite récupérer la ligne et la colonne d'une cellule dans une tableau ,
lorsque je clique sur une cellule j'affiche sa position (ligne , colonne)
merci
Salut,
Pour savoir quelle case du tableau a été clickée, vous pouvez connecter le signal "itemClicked(QTableWidgetItem *)" a une méthode qui récupèrera
les (row, column) du QTableWidgetItem passé en paramètre.
En gros ca donne:
- W
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 class MyTable(QTableWidget): def __init__(self, *args, **kwds): #... QObject.connect(self, SIGNAL("itemClicked(QTableWidgetItem *)"), self._itemClicked) #... def _itemClicked(self, item): print "text=%s, row=%d, column=%d" % ( item.text(), item.row()+1, item.column()+1)
merci mais ca fonctionne pas
je l'ai testé y a pas de messages d'erreur mais aussi rien ne s'affiche .
voici sur le code sur le quel j'ai fait le test :
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 #!/usr/bin/python # -*- coding: utf-8 -*- from __future__ import division # Python 2.7 import sys from PyQt4 import QtCore, QtGui ############################################################################# def prendcase(table, row, col): """Retourne la valeur de la case [row, col] de la table QTableWidget""" item = table.item(row, col) if item == None: # soit la case n'a jamais �t� initialis�e, soit elle a un widget if issubclass(type(table.cellWidget(row,col)), QtGui.QComboBox): # c'est un combobox: renvoyer la valeur affich�e item = table.cellWidget(row,col) return unicode(item.currentText()) # la case ne contient rien: renvoyer une chaine vide return u"" else: return unicode(item.text()) ############################################################################# class Fenetre(QtGui.QWidget): # ======================================================================= def __init__(self, parent=None): super(Fenetre, self).__init__(parent) # cr�er le lineEdit self.lineEdit = QtGui.QLineEdit(self) # cr�er le tableau self.tableWidget = QtGui.QTableWidget(self) self.tableWidget.setGeometry(QtCore.QRect(0, 30, 361, 301)) self.nbrow, self.nbcol = 5, 3 self.tableWidget.setRowCount(self.nbrow) self.tableWidget.setColumnCount(self.nbcol) # on met un combobox en [row=1, col=1] self.listecombo = ['toto', 'titi', 'tata', 'tutu'] self.combo = QtGui.QComboBox() self.combo.addItems(self.listecombo) self.rowcombo, self.colcombo = 1, 1 self.tableWidget.setCellWidget(self.rowcombo, self.colcombo, self.combo) # lancera la m�thode saisieval � chaque changement de case QtCore.QObject.connect(self.tableWidget, QtCore.SIGNAL('currentCellChanged(int,int,int,int)'), self.saisieval) # lancera la m�thode saisievalder � chaque changement de contenu de case QtCore.QObject.connect(self.tableWidget, QtCore.SIGNAL('itemChanged(QTableWidgetItem *)'), self.saisievalder) # QtCore.QObject.connect(self.tableWidget, QtCore.SIGNAL('itemClicked(QTableWidgetItem *)'),self._itemClicked) # mettre le focus sur la case [0,0] du tableau self.tableWidget.setFocus() self.tableWidget.setCurrentCell(0, 0) # ======================================================================= def saisieval(self, row, col, row0, col0): """M�thode lanc�e � chaque changement de case du tableau row, col = coordonn�es de la nouvelle case row0, col0 = coordonn�es de l'ancienne case """ val = prendcase(self.tableWidget, row0, col0) self.lineEdit.setText(val) # ======================================================================= def saisievalder(self, item): """m�thode lanc�e � chaque changement de contenu en fin d'�dition""" row = self.tableWidget.currentRow() col = self.tableWidget.currentColumn() if row==self.tableWidget.rowCount()-1 and col==self.tableWidget.columnCount()-1: val = prendcase(self.tableWidget, row, col) self.lineEdit.setText(val) def _itemClicked(self, item): print "text=%s, row=%d, column=%d" % ( item.text(), item.row()+1, item.column()+1) ############################################################################# if __name__ == "__main__": app = QtGui.QApplication(sys.argv) fen = Fenetre() fen.show() sys.exit(app.exec_())
une autre question leest ce que ça fonctionne si on se déplace avec tab ?? et si on a une liste déroulante dans l'une des cellules ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part QtCore.QObject.connect(self.tableWidget, QtCore.SIGNAL('itemClicked(QTableWidgetItem *)'),self._itemClicked)
je pense que avec itemChanged on peut récupérer la colonne et la ligne d'une cellule quelque soit le déplacement avec tab ou la souris
mais pour la liste déroulante je n'ai pas encore une idée
Salut,
Pour itemClicked se déclenche, il faut que la "case" contienne un QTableWidgetItem.
Dans l'exemple ci dessous, je crée une QTableWidget contenant 3x3 cases.
Regardez les signaux émis suivant <TAB>, <click> ou modifications.
- W
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 import sys from PyQt4 import * from PyQt4.QtGui import QTableWidget, QTableWidgetItem, QApplication from PyQt4.QtCore import SIGNAL, QObject datas = { 'A' : ['a0', 'a1', 'a2'], 'B' : ['b0', 'b1', 'b2'], } def load(tableWidget, data): col = 0 for key, values in data.iteritems(): row = 0 for item in values: tableWidget.setItem(row, col, QTableWidgetItem(item)) row += 1 col += 1 connect = QObject.connect class MyTable(QTableWidget): def __init__(self, datas=None, *args): super(MyTable, self).__init__(*args) self._datas = datas if datas is not None: load(self, datas) connect(self, SIGNAL('itemChanged(QTableWidgetItem *)'), self._itemChanged) connect(self, SIGNAL('itemClicked(QTableWidgetItem *)'), self._itemClicked) def _itemChanged(self, item): print '_itemChanged:', self._show_item(item) def _itemClicked(self, item): print '_itemClicked:', self._show_item(item) def _show_item(self, item): print "text=%s, row=%d, column=%d" % ( item.text(), item.row()+1, item.column()+1) def main(args): app = QApplication(args) table = MyTable(None, 3, 3) table.show() sys.exit(app.exec_()) if __name__=="__main__": main(sys.argv)
merci
mais le souci ce que itemChanged(QTableWidgetItem *) est limité pour les cellule de type item.text() si on a un item.currentText() ca fonctionne plus car pour le currentText() il faut un signal currentCellChanged(int,int,int,int)
Plusieurs signaux qui vous permettent de récupérer la même information.
Si vous clicker sur une case, vous aurez itemClicked et currentCellChanged qui diront que la "case" sélectionnée n'est plus la même.
Note: vous avez aussi la possibilité de sélectionner des lignes et des colonnes et pas seulement des cases...
itemChanged n'est levé que lorsque le contenu de la case a été modifié - et la case n'est généralement modifiable que si elle a été "sélectionnée" avant - i.e. vous avez, à priori, déjà reçu les signaux précédents.
La question est plutôt de savoir quelles sont les actions qui pourront être associées aux différents changements d'états de la sélection et des contenus.
- W
ok
mais la question qui reste c'est comment alors connaitre la ligne et colonne s'il s'agit d'une cellule sous forme d'une liste déroulante ???
ton exemple marche mais pas pour les cellules contenant des listes déroulantes !!!!
currentCellChanged remonte bien lorsque la case contenant la comboBox est sélectionnée.
Après c'est une question d'interface avec la bonne "boîte".
Les changements d'état de la comboBox sont spécifiques à cette comboBox que celle ci soit incrustée dans la case d'une tableWidget ou autre...
C'est un widget à part entière et si on ne connecte pas ses signaux, ils restent muets.
- W
yes
il suffit juste de rajouter :dans le code que j'avais postulé
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 print "row=%d, column=%d " % ( row0,col0)
ce qui donne :
on arrive alors à afficher la ligne et la colonne de chaque case meme s'il y a une liste derouante ...
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 #!/usr/bin/python # -*- coding: utf-8 -*- from __future__ import division # Python 2.7 import sys from PyQt4 import QtCore, QtGui ############################################################################# def prendcase(table, row, col): """Retourne la valeur de la case [row, col] de la table QTableWidget""" item = table.item(row, col) if item == None: # soit la case n'a jamais �t� initialis�e, soit elle a un widget if issubclass(type(table.cellWidget(row,col)), QtGui.QComboBox): # c'est un combobox: renvoyer la valeur affich�e item = table.cellWidget(row,col) return unicode(item.currentText()) # la case ne contient rien: renvoyer une chaine vide return u"" else: return unicode(item.text()) ############################################################################# class Fenetre(QtGui.QWidget): # ======================================================================= def __init__(self, parent=None): super(Fenetre, self).__init__(parent) # cr�er le lineEdit self.lineEdit = QtGui.QLineEdit(self) # cr�er le tableau self.tableWidget = QtGui.QTableWidget(self) self.tableWidget.setGeometry(QtCore.QRect(0, 30, 361, 301)) self.nbrow, self.nbcol = 5, 3 self.tableWidget.setRowCount(self.nbrow) self.tableWidget.setColumnCount(self.nbcol) # on met un combobox en [row=1, col=1] self.listecombo = ['toto', 'titi', 'tata', 'tutu'] self.combo = QtGui.QComboBox() self.combo.addItems(self.listecombo) self.rowcombo, self.colcombo = 1, 1 self.tableWidget.setCellWidget(self.rowcombo, self.colcombo, self.combo) # lancera la m�thode saisieval � chaque changement de case QtCore.QObject.connect(self.tableWidget, QtCore.SIGNAL('currentCellChanged(int,int,int,int)'), self.saisieval) # lancera la m�thode saisievalder � chaque changement de contenu de case QtCore.QObject.connect(self.tableWidget, QtCore.SIGNAL('itemChanged(QTableWidgetItem *)'), self.saisievalder) # QtCore.QObject.connect(self.tableWidget, QtCore.SIGNAL('itemClicked(QTableWidgetItem *)'),self._itemClicked) # mettre le focus sur la case [0,0] du tableau self.tableWidget.setFocus() self.tableWidget.setCurrentCell(0, 0) # ======================================================================= def saisieval(self, row, col, row0, col0): """M�thode lanc�e � chaque changement de case du tableau row, col = coordonn�es de la nouvelle case row0, col0 = coordonn�es de l'ancienne case """ val = prendcase(self.tableWidget, row0, col0) print val print "row=%d, column=%d " % ( row0,col0) self.lineEdit.setText(val) # ======================================================================= def saisievalder(self, item): """m�thode lanc�e � chaque changement de contenu en fin d'�dition""" row = self.tableWidget.currentRow() col = self.tableWidget.currentColumn() if row==self.tableWidget.rowCount()-1 and col==self.tableWidget.columnCount()-1: val = prendcase(self.tableWidget, row, col) self.lineEdit.setText(val) def _itemClicked(self, item): print "text=%s, row=%d, column=%d" % ( item.text(), item.row()+1, item.column()+1) ############################################################################# if __name__ == "__main__": app = QtGui.QApplication(sys.argv) fen = Fenetre() fen.show() sys.exit(app.exec_())
merci à tes conseils et à ta disponibilité
j'ai encore une question qui peut être bidon
mais j'ai remarqué que quand je lance le programme et avant même de saisir
j'ai ce résultat(c'est une chaine vide qui est renvoyée) :valeur saisie
row=-1, column=-1
voici le code pour le testeret ce qu'on peut échapper à ca ? si oui comment ??
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 #!/usr/bin/python # -*- coding: utf-8 -*- from __future__ import division # Python 2.7 import sys from PyQt4 import QtCore, QtGui ############################################################################# def prendcase(table, row, col): """Retourne la valeur de la case [row, col] de la table QTableWidget""" item = table.item(row, col) if item == None: # soit la case n'a jamais �t� initialis�e, soit elle a un widget if issubclass(type(table.cellWidget(row,col)), QtGui.QComboBox): # c'est un combobox: renvoyer la valeur affich�e item = table.cellWidget(row,col) return unicode(item.currentText()) # la case ne contient rien: renvoyer une chaine vide return u"" else: return unicode(item.text()) ############################################################################# class Fenetre(QtGui.QWidget): # ======================================================================= def __init__(self, parent=None): super(Fenetre, self).__init__(parent) # cr�er le lineEdit self.lineEdit = QtGui.QLineEdit(self) # cr�er le tableau self.tableWidget = QtGui.QTableWidget(self) self.tableWidget.setGeometry(QtCore.QRect(0, 30, 361, 301)) self.nbrow, self.nbcol = 5, 3 self.tableWidget.setRowCount(self.nbrow) self.tableWidget.setColumnCount(self.nbcol) # on met un combobox en [row=1, col=1] self.listecombo = ['toto', 'titi', 'tata', 'tutu'] self.combo = QtGui.QComboBox() self.combo.addItems(self.listecombo) self.rowcombo, self.colcombo = 1, 1 self.tableWidget.setCellWidget(self.rowcombo, self.colcombo, self.combo) # lancera la m�thode saisieval � chaque changement de case QtCore.QObject.connect(self.tableWidget, QtCore.SIGNAL('currentCellChanged(int,int,int,int)'), self.saisieval) # lancera la m�thode saisievalder � chaque changement de contenu de case QtCore.QObject.connect(self.tableWidget, QtCore.SIGNAL('itemChanged(QTableWidgetItem *)'), self.saisievalder) # QtCore.QObject.connect(self.tableWidget, QtCore.SIGNAL('itemClicked(QTableWidgetItem *)'),self._itemClicked) # mettre le focus sur la case [0,0] du tableau self.tableWidget.setFocus() self.tableWidget.setCurrentCell(0, 0) # ======================================================================= def saisieval(self, row, col, row0, col0): """M�thode lanc�e � chaque changement de case du tableau row, col = coordonn�es de la nouvelle case row0, col0 = coordonn�es de l'ancienne case """ val = prendcase(self.tableWidget, row0, col0) print "valeur saisie",val print "row=%d, column=%d " % ( row0,col0) self.lineEdit.setText(val) # ======================================================================= def saisievalder(self, item): """m�thode lanc�e � chaque changement de contenu en fin d'�dition""" row = self.tableWidget.currentRow() col = self.tableWidget.currentColumn() if row==self.tableWidget.rowCount()-1 and col==self.tableWidget.columnCount()-1: val = prendcase(self.tableWidget, row, col) self.lineEdit.setText(val) def _itemClicked(self, item): print "text=%s, row=%d, column=%d" % ( item.text(), item.row()+1, item.column()+1) ############################################################################# if __name__ == "__main__": app = QtGui.QApplication(sys.argv) fen = Fenetre() fen.show() sys.exit(app.exec_())
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager