Имеется таблица, в одном из столбцов необходимо вести контроль правильности ввода данных путем применения масок. Для этого каждому нужному итему в таблице был присвоен делегат, в котором был переопределен метод qtablewidgetitem ctrateEditor. В нем происходит создание объекта QLineEdit, в котором и происходит путем проверки индекса ячейки наложение соответствующей маски. Код.
class articleValidate(QtGui.QItemDelegate):
def __init__(self, row, parent = None):
QtGui.QItemDelegate.__init__(self, parent)
self.row = row
def createEditor(self, parent, options, index):
editor = QtGui.QLineEdit()
if self.row == 'Article':
valid = QtGui.QIntValidator(1000000, 9999999, self)
elif self.row == 'Name':
rx = QtCore.QRegExp("(.{,80})")
valid = QtGui.QRegExpValidator(rx, self)
elif self.row == 'Size':
rx = QtCore.QRegExp("(.{,30})")
valid = QtGui.QRegExpValidator(rx, self)
.................................
editor.setValidator(valid)
return editor
self.item_delegate = itemDelegate.articleValidate(0)
self.table.setItemDelegateForColumn(1, self.item_delegate)
self.connect(self.table, QtCore.SIGNAL('cellDoubleClicked(int, int)'), lambda row = 1: self.slot_cellClick(row))
def slot_cellClick(self, row):
self.item_delegate.__init__(self.field[row])
В результате этого хитрого действия мы имеем праздник, каждая ячейка имеет свою маску ввода. Но есть момент. Во первых вызов QLineEdit приводит к тому, что при двойном клике по ячейке, происходит создание нового окна, с QLineEdit внутри, который имеет все повадки QTableWidgetItem, т. е. при закрытии окна или нажатии ввода он закрывается и данные переносятся в ячейку. Во вторых, ввиду того, что конструктор делегата вызывается для конкретного виджета по сигналу двойного клика, попытка просто начать ввод текста в ячейку приводит к крешу, так как QTableWidgetItem пытается обратиться к делегату без указания индекса ячейки. Можно начать конечно выкручиваться - заблокировать ячейку для ввода с клавиатуры, или отлавливать нажатия, и при оном определять позицию и вызывать конструктор делегата. Но мне кажется что может быть все проще, возможно ли заставить QLineEdit интегрироваться в ячейку, а не вылезать в отдельном окне?