我已经基于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 像素)绘制到左侧。
到现在为止还挺好; 一切正常,绘图正确完成。然而...
问题是虽然项目稍微向左绘制(这没关系),但鼠标事件仍在工作,就好像项目根本没有移动一样;这是它的工作原理:
是否可以告诉代表整个项目略微向左绘制,以便当我单击复选框(也与整个项目一起移动)时,模型会正确更新?