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
| #!/usr/bin/python3
# -*- coding: utf-8 -*-
# Python 3 PyQt5
import sys, os
from functools import partial
from PyQt5 import QtCore, QtGui, QtWidgets
#############################################################################
class Fenetre(QtWidgets.QWidget):
# =======================================================================
def __init__(self, parent=None):
super(Fenetre, self).__init__(parent)
self.resize(300, 200)
self.data = [["a", "20150527", "d"], ["e", "20140215", "g"], ["h", "20151005", "j"]]
# crée le modèle de données
self.model = QtGui.QStandardItemModel()
# 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)
# met les titres des colonnes
headers = ['col1','col2','col3']
for j, header in enumerate(headers):
titrecol = QtGui.QStandardItem(header)
self.model.setHorizontalHeaderItem(j, titrecol)
# crée le QTableView
self.tablevue = QtWidgets.QTableView(self)
# connecte le QTableView au modèle de données
self.tablevue.setModel(self.model)
# ajuste la largeur des colonnes à leur contenu
self.tablevue.resizeColumnsToContents()
# exécutera la méthode donnée à chaque clic sur le QTableView
self.tablevue.clicked.connect(self.clic_tablevue)
# positionne le QTableView dans la fenêtre
posit = QtWidgets.QGridLayout()
posit.addWidget(self.tablevue, 0, 0)
self.setLayout(posit)
# =======================================================================
def clic_tablevue(self, index):
"""exécuté à chaque clic sur le QTableView
"""
if index.column() == 1:
# => on a cliqué sur la colonne des dates (indice 1)
# récup du contenu (str) de la case cliquée
date = index.data()
# crée un QDate avec la date de la case cliquée
qdate = QtCore.QDate()
qdate.setDate(int(date[:4]), int(date[4:6]), int(date[6:]))
# crée le calendrier
self.cal = QtWidgets.QCalendarWidget()
self.cal.setGridVisible(True)
# prépare la sortie du calendrier (on passe index en plus!)
self.cal.clicked.connect(partial(self.clic_cal, index))
# initialise le calendrier avec la date de la case cliquée
self.cal.setSelectedDate(qdate)
# affiche la fenêtre du calendrier
self.cal.show()
# =======================================================================
def clic_cal(self, index, qdate):
"""exécuté à chaque clic sur une date du calendrier
"""
# récupère la date sélectionnée sous forme de chaine
date2 = "%4d%02d%02d" % (qdate.year(), qdate.month(), qdate.day())
# modifie la donnée grâce au modèle
self.tablevue.model().setData(index, date2)
# et ferme la fenêtre du calendrier
self.cal.close()
# =======================================================================
def keyPressEvent(self, event):
if self.tablevue.hasFocus():
if event.key() == QtCore.Qt.Key_X and (event.modifiers() & QtCore.Qt.AltModifier):
# récupére la liste data après modification
imax, jmax = self.tablevue.model().rowCount(), 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 = item.data(QtCore.Qt.DisplayRole)
data2[-1].append(elem)
print(data2)
event.accept()
else:
event.ignore()
else:
event.ignore()
#############################################################################
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
fen = Fenetre()
fen.setAttribute(QtCore.Qt.WA_DeleteOnClose)
fen.show()
sys.exit(app.exec_()) |
Partager