我已经根据Qt示例列表中的Simple Tree Model Example
创建了一个项目并编辑了它的模型,以便也可以检查一些项目;这是它的样子:
我想将一些项目略微移动到左侧。所以我通过推导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个像素)向左绘制。
到现在为止还挺好;一切运作良好,绘图正确完成。然而...
问题是虽然项目略微向左拉(这没关系),鼠标事件仍在工作,好像项目根本没有移动;这是它的工作原理:
是否有可能告诉代表整个项目是略向左侧绘制的,这样当我点击复选框(它也与整个项目一起移动)时,模型将被正确更新?
您可以更改ItemViewItem
在屏幕上的呈现方式,但不会更改它对用户操作的响应方式。
我建议你重新实施QStyledItemDelegate::editorEvent;为了调整QRect
返回的QStyle::subElementRect的位置,当时用QStyle::SE_ItemViewItemCheckIndicator作为参数。
请考虑以下步骤:
editorEvent
类中添加公共TreeItemDelegate
方法QStyledItemDelegate::editorEvent
复制到您的代码中QStyledItemDelegate
的私有方法
const QWidget *widget = QStyledItemDelegatePrivate::widget(option);
QStyle *style = widget ? widget->style() : QApplication::style();
至
QStyle *style = option.widget->style();
checkRect
的位置
QRect checkRect = style->subElementRect(QStyle::SE_ItemViewItemCheckIndicator, &viewOpt, widget);
至
QRect checkRect = style->subElementRect(QStyle::SE_ItemViewItemCheckIndicator, &viewOpt, option.widget).adjusted(-10, 0, -10, 0);