代码之家  ›  专栏  ›  技术社区  ›  Jacob Krieg

使用QStyledItemDelegate绘制QTreeView项

  •  2
  • Jacob Krieg  · 技术社区  · 6 年前

    Simple Tree Model Example 从Qt示例列表中编辑其模型,以便还可以检查某些项;它看起来是这样的:

    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

    到现在为止,一直都还不错;一切都很好,画得很好。然而。。。

    问题是,尽管项目稍微向左绘制(这是可以的),但是鼠标事件仍然工作,就好像项目根本没有移动一样;其工作原理如下:

    enter image description here

    是否可以告诉学员整个项目稍微向左绘制,以便当我单击复选框(复选框也与整个项目一起移动)时,模型将正确更新?

    1 回复  |  直到 6 年前
        1
  •  4
  •   scopchanov    6 年前

    你改变了 ItemViewItem

    解决方案

    QStyledItemDelegate::editorEvent ; 为了调整 QRect 退回人 QStyle::subElementRect 打电话的时候 QStyle::SE_ItemViewItemCheckIndicator 作为论据。

    例子

    1. 添加公共 editorEvent 方法 TreeItemDelegate
    2. 复制 default implementation 属于 QStyledItemDelegate::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);
      
    推荐文章