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)
Partager