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
| #!/usr/bin/python
# -*- coding: utf-8 -*-
from __future__ import division, print_function, unicode_literals
# Python 2.7
import sys, os
from PyQt4 import QtCore, QtGui
#############################################################################
class StyleDelegate(QtGui.QStyledItemDelegate):
"""permet de changer l'affichage des données dans chaque case"""
#========================================================================
def __init__(self, parent=None):
super(StyleDelegate, self).__init__(parent)
#========================================================================
def paint(self, painter, option, index):
"""affichage de chaque case
type des arguments:
painter: QtGui.QPainter
option: QtGui.QStyleOptionViewItemV4
index: QtCore.QModelIndex
"""
# modifier l'affichage des nombres de la colonne d'indice 6
if index.column()==6:
# sauvegarde les valeurs du painter
painter.save()
# rectangle de la case d'affichage
rect = option.rect
# pour que la case courante qui a le focus soit en bleu
if option.state & QtGui.QStyle.State_Selected:
# fond de la case en bleu
painter.fillRect(option.rect, option.palette.highlight())
# texte en blanc pour le contraste avec le bleu
pen = painter.pen()
pen.setColor(QtGui.QApplication.palette().color(QtGui.QPalette.HighlightedText))
painter.setPen(pen)
else:
# fond des cases "normales" (non courantes)
painter.fillRect(option.rect, QtGui.QBrush(index.data(QtCore.Qt.BackgroundRole)))
# récupérer le nombre entier à afficher
nb = index.model().data(index, QtCore.Qt.DisplayRole).toInt()[0]
# formater le nombre pour affichage
value = "{:,}".format(nb).replace(',', ' ')
# afficher le nombre
painter.drawText(rect, QtCore.Qt.AlignVCenter | QtCore.Qt.AlignRight, value)
# restaure les valeurs initiales du painter
painter.restore()
else:
# traitement des cas "normaux"
QtGui.QStyledItemDelegate.paint(self, painter, option, index)
#############################################################################
class Fenetre(QtGui.QWidget):
def __init__(self, data=[[]], parent=None):
super(Fenetre, self).__init__(parent)
self.resize(800, 600)
# données à traiter: ici, une liste de listes
self.data = data
# modèle adapté au type de données à traiter
self.model = QtGui.QStandardItemModel()
# met les titres des colonnes
headers = ['col1','col2','col3','col4','col5','col6','col7']
for j, header in enumerate(headers):
titrecol = QtGui.QStandardItem(header)
self.model.setHorizontalHeaderItem(j, titrecol)
# stocke le type de données des colonnes
self.typecol = [type(elem) for elem in self.data[0]]
# 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)
# crée le tableau avec son modèle et son delegate
self.tablevue = QtGui.QTableView(self)
self.tablevue.setModel(self.model)
self.tablevue.setItemDelegate(StyleDelegate()) # delegate sous-classé
# ajuste la largeur des colonnes à leur contenu
self.tablevue.resizeColumnsToContents()
# positionne le tableau dans la fenêtre
posit = QtGui.QGridLayout()
posit.addWidget(self.tablevue, 0, 0)
self.setLayout(posit)
# =======================================================================
def datasmodif(self):
"""retourne les données modifiées après intervention de l'utilisateur"""
imax = self.tablevue.model().rowCount()
jmax = 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 = unicode(item.data(QtCore.Qt.DisplayRole).toString())
# conversion selon le type de données de la colonne j
if self.typecol[j]==int:
elem = int(elem.replace(' ', ''))
# ajout
data2[-1].append(elem)
return data2
# =======================================================================
def keyPressEvent(self, event):
if self.tablevue.hasFocus():
# déclenché avec Alt-X
if event.key() == QtCore.Qt.Key_X and \
(event.modifiers() & QtCore.Qt.AltModifier):
# affiche en console le tableau des données initiales
print(self.data)
# affiche en console le tableau des données modifiées
data2 = self.datasmodif()
print(data2)
event.accept()
else:
event.ignore()
else:
event.ignore()
#############################################################################
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
data = [[101, "Transfert 1000", 45, 26, 10, 456, 12345678],
[102, "Transfert 1001", 45, 26, 10, 456, 23456789],
[103, "Transfert 1002", 45, 26, 10, 456, 34567890]]
fen = Fenetre(data)
fen.setAttribute(QtCore.Qt.WA_DeleteOnClose)
fen.show()
sys.exit(app.exec_()) |
Partager