[PyQt] table view/model/delegate issue

Kerri Reno kreno at yumaed.org
Wed Mar 9 20:04:16 GMT 2011


Thank you so much, Pete!  That was it!  I just wasn't seeing it.  Thanks for
making my day!

On Wed, Mar 9, 2011 at 12:42 PM, Hans-Peter Jansen <hpj at urpla.net> wrote:

> On Wednesday 09 March 2011, 20:15:13 Kerri Reno wrote:
> > 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_()
>
> It looks, like you missed to reimplement setEditorData in your item
> delegate.
>
> Hth,
> Pete
> _______________________________________________
> PyQt mailing list    PyQt at riverbankcomputing.com
> http://www.riverbankcomputing.com/mailman/listinfo/pyqt
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.riverbankcomputing.com/pipermail/pyqt/attachments/20110309/03d672fc/attachment-0001.html>


More information about the PyQt mailing list