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 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
| #!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class Fenetre(QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# crée le tableau
nl=5
nc=3
self.__table=QTableWidget(self)
self.__table.setColumnCount(nc)
self.__table.setRowCount(nl)
# L'éditeur
self.__editor=self.__QtEditor(self)
self.__table.setItemDelegate(self.__editor)
# remplit toutes les cases de la table
for i in range(0, nl):
for j in range(0, nc):
item=QTableWidgetItem("case %d,%d" % (i, j))
self.__table.setItem(i, j, item)
# Traitement colonne
if j == 0:
# La valeur courante est un texte (accessible par un QLineEdit)
item.setData(
Qt.UserRole,
{
j : {
"orig" : "case %d, %d" % (i, j),
"saisie" : "case %d, %d" % (i, j),
},
},
)
elif j == 1:
# La valeur courante est un indice (accessible par un ComboBox)
item.setData(
Qt.UserRole,
{
j : {
"orig" : 0,
"saisie" : 0,
},
},
)
# if
# for
# for
self.__table.resizeRowsToContents()
self.__table.resizeColumnsToContents()
# positionne le QTableWidget dans la fenêtre
posit=QGridLayout(self)
posit.addWidget(self.__table, 0, 0)
# __init__()
# L'éditeur associé au QTableWidget
class __QtEditor(QItemDelegate):
# Création de l'éditeur (méthode surchargée)
def createEditor(self, parent, option, index):
# Colonne 0 du tableau: ce sera un QLineEdit
if index.column() == 0:
# Création d'une zone de saisie
editor=QLineEdit(parent)
return editor
# if
# Colonne 1 du tableau: ce sera un ComboBox
if index.column() == 1:
editor=QComboBox(parent)
editor.addItems(['toto1', 'toto2', 'toto3'])
return editor
# if
# Pour les autres colonnes, aucun éditeur
return None
# createEditor()
# Positionne valeur dans zone d'édition
def setEditorData(self, editor, index):
# S'il n'y a pas d'éditeur
if editor is None: return
# Récupération informations associés à la ligne/colonne
indexRef=index.sibling(index.row(), index.column())
data=indexRef.model().data(
indexRef,
Qt.UserRole,
)
print(data, type(data))
# Traitement de la colonne en cours
if index.column() == 0:
# Positionne valeur dans zone d'édition
editor.setText(data[0]["saisie"])
elif index.column() == 1:
# Positionne valeur dans zone d'édition
editor.setCurrentIndex(data[1]["saisie"])
# setEditorData()
# Enregistre valeur dans modèle
def setModelData(self, editor, model, index):
# S'il n'y a pas d'éditeur, inutile de continuer
if editor is None: return
# Récupération informations associés à la ligne/colonne
indexRef=index.sibling(index.row(), index.column())
data=indexRef.model().data(
indexRef,
Qt.UserRole,
)
# Traitement de la colonne en cours
if index.column() == 0:
# Récupération valeur éditeur
v=editor.text()
# Stockage valeur dans data correspondante
data[0]["saisie"]=v
# Enregistre valeur dans modèle
model.setData(
index,
QVariant(v),
)
elif index.column() == 2:
# Récupération valeur éditeur
v=editor.currentIndex()
# Stockage valeur dans data correspondante
data[1]["saisie"]=v
# Enregistre valeur dans modèle
model.setData(
index,
QVariant(v),
)
# if
# Stocke éléments saisis dans index de référence
indexRef.model().setData(
indexRef,
QVariant(data),
Qt.UserRole,
)
# setModelData()
# Géométrie de l'éditeur (méthode surchargée)
def updateEditorGeometry(self, editor, option, index):
# S'il n'y a pas d'éditeur, inutile de continuer
if editor is None: return
# Géométrie de l'éditeur
editor.setGeometry(option.rect)
# updateEditorGeometry()
# class __QtEditor
# class Fenetre
if __name__ == "__main__":
app=QApplication(sys.argv)
fen=Fenetre()
fen.show()
sys.exit(app.exec_())
# if |