使用QStyledItemDelegate绘制QTreeView项

问题描述 投票:2回答:1

我已经根据Qt示例列表中的Simple Tree Model Example创建了一个项目并编辑了它的模型,以便也可以检查一些项目;这是它的样子:

enter image description here

我想将一些项目略微移动到左侧。所以我通过推导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个像素)向左绘制。

到现在为止还挺好;一切运作良好,绘图正确完成。然而...

问题是虽然项目略微向左拉(这没关系),鼠标事件仍在工作,好像项目根本没有移动;这是它的工作原理:

enter image description here

是否有可能告诉代表整个项目是略向左侧绘制的,这样当我点击复选框(它也与整个项目一起移动)时,模型将被正确更新?

c++ qt qtreeview qstyleditemdelegate qstyle
1个回答
3
投票

Cause

您可以更改ItemViewItem在屏幕上的呈现方式,但不会更改它对用户操作的响应方式。

Solution

我建议你重新实施QStyledItemDelegate::editorEvent;为了调整QRect返回的QStyle::subElementRect的位置,当时用QStyle::SE_ItemViewItemCheckIndicator作为参数。

Example

请考虑以下步骤:

  1. editorEvent类中添加公共TreeItemDelegate方法
  2. default implementationQStyledItemDelegate::editorEvent复制到您的代码中
  3. 通过改变来避免调用QStyledItemDelegate的私有方法 const QWidget *widget = QStyledItemDelegatePrivate::widget(option); QStyle *style = widget ? widget->style() : QApplication::style(); QStyle *style = option.widget->style();
  4. 通过改变来调整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);
© www.soinside.com 2019 - 2024. All rights reserved.