Hello, I would like to act before the change of the content of one cell in a table. To do that I have made all the cells not editable, and I have tried to use the *keyevent* method. This does not work : only the enter key is recognized.
Indeed, I would to act if A is pressed, without changing the content of the cell, and also to change the content only if one digit is pressed. What is the good way to do that ? I've put one minimal not working code just after. One precision : some celle cannot be changed (this is for a sudoku). Best regards. Christophe BAL *==== THE CODE ====* * * *#! /usr/bin/env python2.7* *# -*- coding: utf-8 -*-* * * *# Source : http://www.developpez.net/forums/d1281788/autres-langages/python-zope/gui/pyside-pyqt/coquille-vide-sudoku/#post7181230 * * * *from __future__ import division* * * *import sys* *from copy import deepcopy* * * *from PySide import QtCore, QtGui* * * *def cellColor(painter, option, color):* * """* * ???* * """* * r = option.rect* * x, y, w, h = r.x() + 1, r.y() + 1, r.width()-2, r.height()-2* * * * if isinstance(color, (str, unicode)):* * color = QtGui.QColor(color)* * * * elif isinstance(color, (list, tuple)):* * if len(color) == 3:* * r, g, b = color* * alpha = 255* * * * else:* * r, g, b, alpha = color* * * * color = QtGui.QColor(r, g, b, alpha)* * * * painter.fillRect(x, y, w, h, color)* * * *def cellBorder(painter, option, where):* * """* * ???* * """* * r = option.rect* * x, y, w, h = r.x(), r.y(), r.width(), r.height()* * * * if where == 'up':* * x1, y1, x2, y2 = x, y, x + w, y* * * * elif where == 'bottom':* * x1, y1, x2, y2 = x + w, y + h, x, y + h* * * * elif where == 'right':* * x1, y1, x2, y2 = x + w, y, x + w, y + h* * * * elif where == 'left':* * x1, y1, x2, y2 = x, y + h, x, y* * * * else:* * return None* * * * pen = QtGui.QPen()* * pen.setWidth(4)* * painter.setPen(pen)* * painter.drawLine(x1, y1, x2, y2)* * * * * *class SudokuDelegate(QtGui.QItemDelegate):* * def __init__(self, parent=None):* * super(SudokuDelegate, self).__init__(parent)* * * * def initGrid(self, grid):* * self.grid_0 = grid* * * * def paint(self, painter, option, index):* * """* * ???* * """* * row, col = index.row(), index.column()* * * * if row == 0 or row == 3 or row == 6:* * if col in[0,3,6]:* * cellBorder(painter, option, 'left')* * cellBorder(painter, option, 'up')* * * * elif col == 8:* * cellBorder(painter, option, 'right')* * cellBorder(painter, option, 'up')* * * * else:* * cellBorder(painter, option, 'up')* * * * elif row in [1,2,4,5,7]:* * if col in [0,3,6]:* * cellBorder(painter, option, 'left')* * * * elif col == 8:* * cellBorder(painter, option, 'right')* * * * elif row == 8:* * if col in[0,3,6]:* * cellBorder(painter, option, 'left')* * cellBorder(painter, option, 'bottom')* * * * elif col == 8:* * cellBorder(painter, option, 'right')* * cellBorder(painter, option, 'bottom')* * * * else:* * cellBorder(painter, option, 'bottom')* * * *# Background color for initial known cells* * if self.grid_0[row][col]!=0:* * cellColor(painter, option, [200,200,200])* * * * QtGui.QItemDelegate.paint(self, painter, option, index)* * * *class MainWindow(QtGui.QWidget):* * def __init__(* * self,* * parent = None* * ):* * super(MainWindow, self).__init__(parent)* * * *# General grid* * self.table = QtGui.QTableWidget(self)* * self.nbrow, self.nbcol = 9, 9* * self.table.setRowCount(self.nbrow)* * self.table.setColumnCount(self.nbcol)* * * *# Each cell has dimension 50 pixels x 50 pixels* * for row in range(0, self.nbrow):* * self.table.setRowHeight(row, 50)* * * * for col in range(0, self.nbcol):* * self.table.setColumnWidth(col, 50)* * * *# Each cell contains one single QTableWidgetItem* * for row in range(0, self.nbrow):* * for col in range(0, self.nbcol):* * item = QtGui.QTableWidgetItem()* * item.setTextAlignment(* * QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter* * )* * * * self.table.setItem(row, col, item)* * * *# Header formatting* * font = QtGui.QFont()* * font.setFamily(u"DejaVu Sans")* * font.setPointSize(12)* * self.table.horizontalHeader().setFont(font)* * self.table.verticalHeader().setFont(font)* * * *# Font used* * font = QtGui.QFont()* * font.setFamily(u"DejaVu Sans")* * font.setPointSize(20)* * self.table.setFont(font)* * * *# Global Size* * self.resize(60*9, 60*9 + 20)* * * *# Layout of the table* * layout = QtGui.QGridLayout()* * layout.addWidget(self.table, 0, 0)* * self.setLayout(layout)* * * *# Initial grid (to test)* * self.grid_0 = [* * [0,0,0, 0,2,0, 9,0,1],* * [0,0,0, 0,0,0, 0,0,3],* * [0,8,0, 3,0,0, 4,5,0],* *#* * [0,4,7, 0,0,5, 0,8,0],* * [0,0,0, 0,0,0, 0,0,0],* * [0,2,0, 9,0,0, 7,4,0],* *#* * [0,9,5, 0,0,2, 0,3,0],* * [6,0,0, 0,0,8, 0,0,0],* * [7,0,4, 0,6,0, 0,0,0]* * ]* * * *# Use of the delegate so to use thicker lines.* * self.delegate = SudokuDelegate(self.table)* * self.table.setItemDelegate(self.delegate)* * self.delegate.initGrid(self.grid_0)* * * *# Initialization of the actual grid* * self.grid = deepcopy(self.grid_0)* * * *# Display the grid.* * self.update(self.grid)* * * *# Set the focus in the first cell* * self.table.setFocus()* * self.table.setCurrentCell(0, 0)* * * * def update(self, g):* * for row in range(0, len(g[0])):* * for col in range(0, len(g)):* * if g[row][col] == 0:* * font = QtGui.QFont()* * font.setFamily(u"DejaVu Sans")* * font.setPointSize(12)* * self.table.item(row, col).setFont(font)* * * * color = QtGui.QColor(0, 0, 255, 255) # bleu* * self.table.item(row, col).setForeground(color)* * * * self.table.item(row, col).setText(* * u"1 2 3\n4 5 6\n7 8 9"* * )* * self.table.item(* * row, col* * ).setFlags(* * QtCore.Qt.ItemIsEnabled* * | QtCore.Qt.ItemIsSelectable* *# | QtCore.Qt.ItemIsEditable* * )* * * * else:* * self.table.item(row, col).setText(unicode(g[row][col])) * * self.table.item(* * row, col* * ).setFlags(* * QtCore.Qt.ItemIsEnabled* * | QtCore.Qt.ItemIsSelectable* * )* * * *# Just for testing !* * color = QtGui.QColor(160, 255, 160, 255) # Light green* * self.table.item(2, 4).setBackground(color)* * * * color = QtGui.QColor(255, 160, 160, 255) # Light red* * self.table.item(6, 3).setBackground(color)* * * * def keyPressEvent(self, event):* * if type(event) == QtGui.QKeyEvent:* * #here accept the event and do something* * print event.key()* * event.accept()* * else:* * event.ignore()* * * *# print self.table.currentColumn(), self.table.currentRow()* * * * * *if __name__ == "__main__":* * app = QtGui.QApplication(sys.argv)* * fen = MainWindow()* * fen.show()* * sys.exit(app.exec_())*
_______________________________________________ PyQt mailing list PyQt@riverbankcomputing.com http://www.riverbankcomputing.com/mailman/listinfo/pyqt