我从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像素)的值绘制到左边。
到目前为止一切都很好,绘图做得很好。然而..。
问题是,虽然项目稍微向左绘制(这是可以的),但是鼠标事件仍然在工作,就好像项目根本没有移动一样;下面是它的工作方式:

是否可以告诉委托,整个项目稍微向左绘制,以便当我单击复选框(该复选框与整个项目一起移动)时,模型将被正确更新?
发布于 2018-09-18 03:55:35
原因
您可以更改ItemViewItem在屏幕上的呈现方式,而不是它对用户操作的响应方式。
解决方案
我建议您重新实现QStyledItemDelegate::editorEvent;以便在调用ItemViewItemCheckIndicator作为参数时调整QStyle::子元素QStyle返回的ItemViewItemCheckIndicator的位置。
示例
考虑以下步骤:
editorEvent类中添加一个公共TreeItemDelegate方法QStyledItemDelegate::editorEvent复制到代码中QStyledItemDelegate的私有方法
QStyledItemDelegatePrivate::QWidget (选项);QStyle *style =小部件?小部件->样式():QApplication::style();
至
QStyle *style = option.widget->style();checkRect的位置
style->subElementRect(QStyle::SE_ItemViewItemCheckIndicator,&viewOpt,小部件);
至
style->subElementRect(QStyle::SE_ItemViewItemCheckIndicator,&viewOpt,option.widget).adjusted(-10,0,-10,0);https://stackoverflow.com/questions/52373040
复制相似问题