David,<br><br>Thanks for your reply.&nbsp; I was passing a QObject (a QDialog to be exact) as the parent to the delegate but I wasn&#39;t storing a reference to the delegate anywhere so perhaps it was being deleted in some cases.&nbsp; I added a variable to store the reference to the delegate but unfortunately that didn&#39;t change anything.&nbsp; I pared down the code to it&#39;s bare minimum and included it here. Thanks for looking into the problem.
<br><br>Brian DeWeese<br><br>&lt;code start of BugTest.py&gt;<br><br>#!/usr/bin/env python<br><br>import sys<br>from PyQt4 import QtGui, QtCore<br><br>_qvChecked = QtCore.QVariant(QtCore.Qt.Checked)<br>_qvUnchecked = QtCore.QVariant
(QtCore.Qt.Unchecked)<br><br>##------------------------------------------------------------------------------<br>class BTObject(object):<br><br>&nbsp;&nbsp;&nbsp; def __init__(self, enabled=False, foo=&#39;&#39;, bar=0):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; object.__init__(self)
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._enabled = enabled<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._foo = foo<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._bar = bar<br><br>&nbsp;&nbsp;&nbsp; def isEnabled(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return self._enabled<br><br>&nbsp;&nbsp;&nbsp; def setEnabled(self, b=True):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._enabled = b
<br><br>&nbsp;&nbsp;&nbsp; def createInlineEditor(self, parent):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return BTObject.InlineEditor(self, parent)<br><br>&nbsp;&nbsp;&nbsp; def __repr__(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return &#39;BTObject(enabled=&#39;+str(self._enabled)+&#39;, foo=\&quot;&#39;+str(self._foo)+&#39;\&quot;, bar=&#39;+str(self._bar)+&#39;)&#39;
<br><br>&nbsp;&nbsp;&nbsp; class InlineEditor(QtGui.QWidget):<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _MUTE = &#39;MUTE&#39;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def __init__(self, btobject, parent):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QtGui.QWidget.__init__(self, parent)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._btobject = btobject
<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.setAutoFillBackground(True)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lo = QtGui.QHBoxLayout()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lo.setMargin(0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lo.setSpacing(4)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._cbFoo = QtGui.QComboBox()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for x in [&quot;ABC&quot;, &quot;DEF&quot;, &quot;GHI&quot;, &quot;JKL&quot;]:
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._cbFoo.addItem(x)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._leBar = QtGui.QLineEdit(str(btobject._bar), self)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._leBar.setValidator(QtGui.QIntValidator(0, 999999, self))<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lo.addWidget
(self._cbFoo, 3)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lo.addSpacing(5)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lo.addWidget(QtGui.QLabel(&#39;Bar:&#39;))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lo.addWidget(self._leBar, 3)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lo.addStretch(5)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.setLayout(lo)<br><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # set the object data into the gui<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._cbFoo.setCurrentIndex(self._cbFoo.findText(self._btobject._foo))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._leBar.setText(str(self._btobject._bar))<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def accept(self):
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; text = str(self._cbFoo.currentText())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._btobject._foo = text<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._btobject._bar = int(self._leBar.text())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &#39;accept: btobject=&#39;+repr(self._btobject)
<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def reject(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pass<br>##&gt;--------------------------------------------------------------------------&lt;##<br>class BTModel(QtCore.QAbstractTableModel):<br><br>&nbsp;&nbsp;&nbsp; def __init__(self, parent=None ):
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QtCore.QAbstractTableModel.__init__(self, parent)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._items = [BTObject(foo=&quot;ABC&quot;, bar=1),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BTObject(foo=&quot;DEF&quot;, bar=2),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BTObject(foo=&quot;GHI&quot;, bar=3)]
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._headerData = (QtCore.QVariant(&quot;Name&quot;), QtCore.QVariant(&quot;repr&quot;))<br><br>&nbsp;&nbsp;&nbsp; def columnCount(self, parentIndex):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return len(self._headerData)<br><br>&nbsp;&nbsp;&nbsp; def flags(self, index):
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not index.isValid():<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return QtCore.Qt.ItemIsEnabled<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if index.column() == 0:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsUserCheckable
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif index.column() == 1:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEditable<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable<br><br>&nbsp;&nbsp;&nbsp; def getItemAt(self, row):
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if row &gt;= 0 and row &lt; len(self._items):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return self._items[row]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return None<br><br>&nbsp;&nbsp;&nbsp; def indexOfItem(self, item):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return self._items.index(item)<br><br>&nbsp;&nbsp;&nbsp; def headerData(self, section, orientation, role):
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if orientation == QtCore.Qt.Horizontal and role in (QtCore.Qt.DisplayRole, QtCore.Qt.EditRole):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return self._headerData[section]<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return QtCore.QVariant()<br><br>&nbsp;&nbsp;&nbsp; def rowCount(self, parentIndex):
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return len(self._items)<br><br>&nbsp;&nbsp;&nbsp; def setData(self, index, value, role):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if index.isValid():<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if index.column() == 0 and role == QtCore.Qt.CheckStateRole:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; state = value.toInt
()[0] # int value stored as a tuple, where&#39;s that documented?<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; btobject = self._items[index.row()]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; btobject.setEnabled(state == QtCore.Qt.Checked)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Force a repaint of the entire row.
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; index2 = self.createIndex(index.row(), 1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.emit(QtCore.SIGNAL(&#39;dataChanged(const QModelIndex &amp;, const QModelIndex &amp;)&#39;), index2, index2)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return True
<br><br>&nbsp;&nbsp;&nbsp; def data( self, index, role ):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not index.isValid():<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return QtCore.QVariant()<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if role == QtCore.Qt.DisplayRole:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; col = index.column()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if col == 0:
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return QtCore.QVariant(self._items[index.row()]._foo)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif col == 1:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return QtCore.QVariant(repr(self._items[index.row()]))<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif role == QtCore.Qt.CheckStateRole
:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if index.column() == 0:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; retVal = _qvUnchecked<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; btobject = self._items[index.row()]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if btobject.isEnabled():<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; retVal = _qvChecked
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return retVal<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return QtCore.QVariant()<br><br>##&gt;--------------------------------------------------------------------------&lt;##<br>class BTItemDelegate(QtGui.QItemDelegate):<br><br>
&nbsp;&nbsp;&nbsp; def __init__(self, parent):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QtGui.QItemDelegate.__init__(self, parent)<br><br>&nbsp;&nbsp;&nbsp; def createEditor(self, parent, option, index):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if index.column() == 1:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; model = index.model()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; btobject = 
model.getItemAt(index.row())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; editor = btobject.createInlineEditor(parent)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return editor<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return QtGui.QItemDelegate.createEditor(self, parent, option, index)<br><br>&nbsp;&nbsp;&nbsp; def setEditorData(self, editor, index):
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;&#39;&#39; I don&#39;t need to do anything here because I passed in the object<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; being edited when the editor was constructed.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;&#39;&#39;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pass<br><br>&nbsp;&nbsp;&nbsp; def setModelData(self, editor, model, index):
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; editor.accept()<br><br>##&gt;--------------------------------------------------------------------------&lt;##<br>class BTEditor(QtGui.QDialog):<br>&nbsp;&nbsp;&nbsp; def __init__(self, parent=None):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QtGui.QDialog.__init_
_(self, parent)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.setWindowTitle(&#39;BTObject Editor&#39;)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Create a button box for the dialog containing the Ok and Cancel buttons<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buttonBox = QtGui.QDialogButtonBox(QtGui.QDialogButtonBox.Ok
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | QtGui.QDialogButtonBox.Cancel);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QtCore.QObject.connect(buttonBox, QtCore.SIGNAL(&#39;accepted()&#39;), self.accept)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QtCore.QObject.connect(buttonBox, QtCore.SIGNAL
(&#39;rejected()&#39;), self.reject)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # The tree view widget<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._view = BTEditor.TableView(self)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._view.setMinimumSize(QtCore.QSize(300, 100))<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._delegate = BTItemDelegate(self)
<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #----------------------------------------------------------------------#<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # If you comment out the setItemDelegat calls than the checkable<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # column will work correctly.&nbsp; If setItemDelegate is uncommented
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # than the custom editor will work but it breaks the checkable<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # column. If setItemDelegateForColumn is uncommented than the<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # checkable column works correctly but my editor is never used
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # either.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #----------------------------------------------------------------------#<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._view.setItemDelegate(self._delegate)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #self._view.setItemDelegateForColumn(1, self._delegate) # this doesn&#39;t work
<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._model = BTModel()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._view.setModel(self._model)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # The final layout, putting it all together<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gl = QtGui.QGridLayout()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gl.addWidget(self._view&nbsp;&nbsp; , 1, 0, 1, 2)
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gl.addWidget(buttonBox&nbsp;&nbsp;&nbsp; , 2, 0, 1, 2)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.setLayout(gl)<br><br>&nbsp;&nbsp;&nbsp; ##------------------------------------------------------------------------##<br>&nbsp;&nbsp;&nbsp; class TableView(QtGui.QTableView):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def __init__(self, parent):
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QtGui.QTableView.__init__(self, parent)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.verticalHeader().hide()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.setAlternatingRowColors(True)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.setEditTriggers(QtGui.QAbstractItemView.DoubleClicked
 |<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QtGui.QAbstractItemView.EditKeyPressed)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.setGridStyle(QtCore.Qt.NoPen)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.setLineWidth(0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows
)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.horizontalHeader().setStretchLastSection(True)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.horizontalHeader().setResizeMode( QtGui.QHeaderView.ResizeToContents
 )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.verticalHeader().setResizeMode( QtGui.QHeaderView.ResizeToContents )<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def sizeHint(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return QtCore.QSize(600, 100)<br><br><br>if __name__ == &quot;__main__&quot;:<br>
&nbsp;&nbsp;&nbsp; app = QtGui.QApplication(sys.argv)<br>&nbsp;&nbsp;&nbsp; win = BTEditor()<br>&nbsp;&nbsp;&nbsp; win.show()<br>&nbsp;&nbsp;&nbsp; app.connect(app, QtCore.SIGNAL(&#39;lastWindowClosed()&#39;), app, QtCore.SLOT(&#39;quit()&#39;))<br>&nbsp;&nbsp;&nbsp; sys.exit(app.exec_())<br><br>
<br>&lt;/code&gt;<br><br>Brian DeWeese<br><br><div><span class="gmail_quote">On 6/5/07, <b class="gmail_sendername">David Boddie</b> &lt;<a href="mailto:david@boddie.org.uk">david@boddie.org.uk</a>&gt; wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
On Fri, 1 Jun 2007 09:56:25 -0500, Brian DeWeese wrote:<br><br>&gt; I have a 2 column QTableView where column 0 is checkable and column 1 is<br>&gt; editable. I&#39;ve written a custom editor by implement QItemDelegate which is
<br>&gt; working fine. Also, the checkbox in column 0 is also working fine. But<br>&gt; not both at the same time.<br>&gt;<br>&gt; If I use view.setItemDelegate(myDelegate) than my delegate is called to<br>&gt; create my custom editor and everything about column 1 works correctly. But
<br>&gt; column 0 doesn&#39;t work correctly. It is displaying a checkbox with the<br>&gt; correct current value but clicking on it does not call my model&#39;s setData()<br>&gt; method or do anything at all as far as I can tell.
<br><br>OK. This doesn&#39;t sound right.<br><br>&gt; If I use view.setItemDelegateForColumn(1, myDelegate) than the checkbox in<br>&gt; colum 0 works but double-clicking on column 1 will ignore my delegate and<br>&gt; create a default editor.
<br><br>Did you create the delegate in a way that stops it from being garbage<br>collected and subsequently deleted on the C++ side? In other words,<br>did you store the instance somewhere, or create it with a parent QObject?
<br><br>I&#39;m guessing that you did, otherwise you wouldn&#39;t see your editor in the<br>previous situation. :-/<br><br>&gt; Is this a known bug in either PyQt or Qt itself? Or am I doing something<br>&gt; wrong?<br><br>
I would like to see more code before declaring something wrong with<br>setItemDelegateForColumn() in either Qt or PyQt.<br><br>&gt; I&#39;m using PyQt 4.1.1 with Qt 4.2 on SUSE 10.1. (BTW, Is there a proper way<br>&gt; to verify that I&#39;m using the versions that I think I&#39;m using?)
<br><br>from PyQt4 import pyqtconfig<br>hex(pyqtconfig._pkg_config[&quot;pyqt_version&quot;])<br>hex(pyqtconfig._pkg_config[&quot;qt_version&quot;])<br><br>&gt; Here is my model.flags() method.<br>&gt;<br>&gt; def flags(self, index):
<br>&gt; if not index.isValid():<br>&gt; return QtCore.Qt.ItemIsEnabled<br>&gt;<br>&gt; if index.column() == 0:<br>&gt; return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable |<br>&gt; QtCore.Qt.ItemIsUserCheckable<br>
<br>You might want to make this editable, too.<br><br>&gt; elif index.column() == 1:<br>&gt; return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable |<br>&gt; QtCore.Qt.ItemIsEditable<br>&gt;<br>&gt; return QtCore.Qt.ItemIsEnabled
 | QtCore.Qt.ItemIsSelectable<br><br>Hope this helps,<br><br>David<br><br>_______________________________________________<br>PyQt mailing list&nbsp;&nbsp;&nbsp;&nbsp;<a href="mailto:PyQt@riverbankcomputing.com">PyQt@riverbankcomputing.com</a>
<br><a href="http://www.riverbankcomputing.com/mailman/listinfo/pyqt">http://www.riverbankcomputing.com/mailman/listinfo/pyqt</a><br></blockquote></div><br>