【问题标题】:Delegate erasing text in QTreeView using QStandardItemModel使用 QStandardItemModel 委托在 QTreeView 中擦除文本
【发布时间】:2014-08-21 12:49:09
【问题描述】:

我在向我的 QTreeView 添加委托时遇到了一些困难。 我通过一个工作正常的模型添加了一些 QStandardItems,但是当我添加委托时,文本被删除,只有图标可见。

这是我用于代理的代码:

void SeqNavDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
       const QModelIndex &index) const
{
    if (index.column() == 0 && option.state & QStyle::State_Enabled)
    {
        const QIcon icon(QLatin1String(":/SeqNavMenu/images/green.png"));

        QRect iconRect(option.rect.right() - option.rect.height(),
                   option.rect.top(),
                   option.rect.height(),
                   option.rect.height());

        icon.paint(painter, iconRect, Qt::AlignRight);
    }
}

我想做的是将两者结合起来,也就是说,有文本和复选框,右边有我放在委托中的图标。

也许有人可以在这里为我指出正确的方向?

干杯。

【问题讨论】:

    标签: c++ qt qtreeview qstandarditemmodel qstyleditemdelegate


    【解决方案1】:

    当您将委托分配给视图时,视图会自行停止渲染项目(实际上,它会使用另一个委托代替您的委托)。因此,它将渲染委托给您。而且您将代理编程为仅绘制图标。这就是为什么您只能看到图标。
    如果您还需要绘制复选框和文本,则需要自己绘制或在实现中的某处调用祖先方法paint。所以如果你从QStyledItemDelegate继承SeqNavDelegate调用:

    QStyledItemDelegate::paint(painter, option, index);
    

    【讨论】:

    • @simpsons 另外我建议你尝试 QStyleOptionViewItem::position。我认为如果您重新实现QAbstractItemView::viewOptions 并将option.decorationPosition 更改为QStyleOptionViewItem::Right,那么您根本不需要使用委托。当请求DecorationRole 时,您只需要在模型的data 方法中返回图标。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    相关资源
    最近更新 更多