Я создал проект на основе Simple Tree Model Example
из списка примеров Qt и отредактировал его модель, чтобы некоторые элементы также можно было проверить;Вот как это выглядит:
Я бы хотел, чтобы некоторые элементы были слегка смещены влево.Поэтому я создал делегат, получив производную QStyledItemDelegate
и переопределив QStyledItemDelegate::paint
следующим образом:
void TreeItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
if (index.column() == 0) {
TreeItem *childItem = static_cast<TreeItem*>(index.internalPointer());
if (childItem->type() == TreeItem::Type::Checkable) {
QStyleOptionViewItem opt = option;
QStyledItemDelegate::initStyleOption(&opt, index);
const int desiredThreshold = 10;
opt.rect.setX(opt.rect.x() - desiredThreshold);
option.widget->style()->drawControl(QStyle::CE_ItemViewItem, &opt, painter, option.widget);
return;
}
}
return QStyledItemDelegate::paint(painter, option, index);
}
Таким образом, элементы типа TreeItem::Type::Checkable
будут отрисовываться влево значением константы desiredThreshold
(в данном случае 10 пикселей).
Пока все хорошо;все работает хорошо, и рисунок сделан правильно.Однако ...
Проблема в том, что, хотя элемент рисуется немного влево (что нормально), события мыши все еще работают так, как если бы элемент вообще не двигался;вот как это работает:
Можно ли сказать делегату, что весь элемент нарисован немного влево, чтобы при нажатии нафлажок (который также был перемещен вместе со всем элементом), модель будет корректно обновлена?