[PyQt] table view/model/delegate issue
Kerri Reno
kreno at yumaed.org
Wed Mar 9 19:15:13 GMT 2011
Hello!
I hope someone can help me with this. I have a QTableView with 3 columns,
the 3rd column is editable, and the first two are not. My problem is when I
double click on the 3rd column, any existing text is cleared. I want to be
able to edit the existing text. I'm using a QItemDelegate, and putting the
text into a QTextEdit editor. I can't see what I'm doing wrong. Please
take a look at my stripped down example, below. I've highlighted the code
that I think should put the text in the editor. What am I doing wrong?
I'm using PyQt 4.7.2 and Python 2.6.5.
Thanks in Advance for any help you can give me!
Kerri
--
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import sys
import datetime
class notesView(QTableView):
def __init__(self,parent,data):
QTableView.__init__(self,parent)
self.setSizePolicy(QSizePolicy.MinimumExpanding,
QSizePolicy.MinimumExpanding)
model = notesModel(data)
self.setModel(model)
self.setItemDelegate(notesDelegate(self))
self.setFixedWidth(400)
self.show()
class notesModel(QAbstractTableModel):
def __init__(self,data):
QAbstractTableModel.__init__(self)
self.notes = data
def flags(self,index):
if not index.isValid():
return Qt.ItemIsEnabled
column = index.column()
if column == 2:
return
Qt.ItemFlags(QAbstractTableModel.flags(self,index)|
Qt.ItemIsEditable)
return Qt.ItemFlags(QAbstractTableModel.flags(self,index))
def rowCount(self, index=QModelIndex()):
return len(self.notes)
def columnCount(self,index=QModelIndex()):
return 3
def data(self,index,role=Qt.DisplayRole):
if not index.isValid() or not (0 <= index.row() <
len(self.notes)):
return QVariant()
note = self.notes[index.row()]
column = index.column()
if role == Qt.DisplayRole:
if column == 0:
return
QVariant(QDate(note['stamp']).toString('MM/dd/yyyy'))
elif column == 1:
return
QVariant(QString("%1").arg(note['print_name']))
elif column == 2:
if note['note']:
return
QVariant(QString("%1").arg(note['note']))
else:
return QVariant('')
elif role == Qt.TextAlignmentRole:
return QVariant(int(Qt.AlignLeft|Qt.AlignTop))
return QVariant()
def setData(self, index, value, role=Qt.EditRole):
if index.isValid() and 0 <= index.row() < len(self.notes):
note = self.notes[index.row()]
column = index.column()
if column == 2:
note['note'] =
str(value.toString().trimmed())
note['stamp'] = datetime.datetime.now()
return True
return False
class notesDelegate(QItemDelegate):
def createEditor(self,parent,option,index):
if index.column() == 2:
text = index.model().data(index).toString()
editor = QTextEdit(parent)
editor.setPlainText(text)
return editor
else:
return
QItemDelegate.createEditor(self,parent,option,index)
def setModelData(self, editor, model, index):
if index.column() == 2:
model.setData(index,QVariant(editor.toPlainText()))
else:
QItemDelegate.setModelData(self, editor, model,
index())
if __name__ == '__main__':
app = QApplication(sys.argv)
data = [{'note' : 'testing',
'print_name' : 'John Anderson',
'stamp' : datetime.datetime(2011,3,9,11,26,16)}]
dlg = notesView(None,data = data)
app.exec_()
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.riverbankcomputing.com/pipermail/pyqt/attachments/20110309/dc1d1a7c/attachment.html>
More information about the PyQt
mailing list