Qt QTableView - Alignment of checkbox when using IsUserCheckable
After further investigation into delegate options I found a nice reference (unfortunately no longer available) and came up with the following hybrid using a QItemDelegate and IsUserCheckable.
Essentially, you need to extend QItemDelegate, and reimplement, using the drawCheck function to center and use the editorEvent
to handle mouse and keyboard events while setting the model with the appropriate state.
void drawCheck(QPainter* painter, QStyleOptionViewItem const& option, QRect const& rect, Qt::CheckState state) const
and
bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
Also see this similar question here...
Probably not the answer you're looking for, however I found it much easier to implement my own checkbox item delegate when using qtableviews.
Solution for Python (PySide, PyQt) to center the checkbox and with editable allowed:
class BooleanDelegate(QItemDelegate):
def __init__(self, *args, **kwargs):
super(BooleanDelegate, self).__init__(*args, **kwargs)
def paint(self, painter, option, index):
# Depends on how the data function of your table model is implemented
# 'value' should recive a bool indicate if the checked value.
value = index.data(Qt.CheckStateRole)
self.drawCheck(painter, option, option.rect, value)
self.drawFocus(painter, option, option.rect)
def editorEvent(self, event, model, option, index):
if event.type() == QEvent.MouseButtonRelease:
value = bool(model.data(index, Qt.CheckStateRole))
model.setData(index, not value)
event.accept()
return super(BooleanDelegate, self).editorEvent(event, model, option, index)
In your table model, make sure that the flags allow the user to check/uncheck the cell.
class MyTableModel(QAbstractTableModel):
...
def flags(self, index):
if not index.isValid():
return Qt.ItemIsEnabled
if index.column() in self.columns_boolean:
return Qt.ItemIsEnabled | Qt.ItemIsUserCheckable
return Qt.ItemFlags(QAbstractTableModel.flags(self, index) | Qt.ItemIsEditable)
Finally, set the BooleanDelagate
in your table
self.boolean_delegate = BooleanDelegate()
self.input_gui.setItemDelegateForColumn(5, self.boolean_delegate)