c – 在QStyledItemDelegate中覆盖QTreeView的文本

我在与重写使用QStyledItemDelegate的QTreeView则显示文本的问题.在执行代码后满足某些条件时:

void MyDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
  .
  .

        QStyleOptionViewItemV4 opt = option;
        initStyleOption(&opt, index);
        QString text = opt.text;
        text = text + QString("TEST");
        opt.text = text;

        QStyledItemDelegate::paint(painter, opt, index);
}

我在debbugger中确认TEST已添加到opt.text中.
然而,当我运行我的程序,并期待在TreeVuew仍然显示没有附加的测试字符串原文.

看来,当我打电话QStyledItemDelegate ::涂料(画家,选择,指数),它忽略了我的选择参数所做的更改.

最佳答案 QStyledItemDelegate :: paint()方法的默认实现使用它自己的QStyleOptionViewItem实例,该实例使用模型中的数据初始化.

从Qt 5.4.0源代码:

void QStyledItemDelegate::paint(QPainter *painter,
        const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    Q_ASSERT(index.isValid());

    QStyleOptionViewItem opt = option;
    initStyleOption(&opt, index);

    const QWidget *widget = QStyledItemDelegatePrivate::widget(option);
    QStyle *style = widget ? widget->style() : QApplication::style();
    style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, widget);
}

解:

不要调用默认实现并实现你的委托的paint()方法,如下所示:

void MyDelegate::paint(QPainter* painter, const QStyleOptionViewItem & option, const QModelIndex & index) const
{
    QStyleOptionViewItem itemOption(option);

    initStyleOption(&itemOption, index);
    itemOption.text = "Test Text";  // override text

    QApplication::style()->drawControl(QStyle::CE_ItemViewItem, &itemOption, painter, nullptr);
}
点赞