[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