gpt4 book ai didi

c++ - 使用 QStyledItemDelegate 绘制 QTreeView 项目

转载 作者:搜寻专家 更新时间:2023-10-31 01:28:22 25 4
gpt4 key购买 nike

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

enter image description here

我希望将一些项目稍微向左移动。因此,我通过派生 QStyledItemDelegate 创建了一个委托(delegate),并像这样重新实现了 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

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

最佳答案

原因

您更改了 ItemViewItem 在屏幕上的呈现方式,但未更改它响应用户操作的方式。

解决方案

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

例子

考虑以下步骤:

  1. 在您的 TreeItemDelegate 类中添加公共(public) editorEvent 方法
  2. 复制default implementation QStyledItemDelegate::editorEvent 到您的代码中
  3. 通过改变

    避免调用QStyledItemDelegate的私有(private)方法
    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);

关于c++ - 使用 QStyledItemDelegate 绘制 QTreeView 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52373040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com