在QStyledItemDelegate中覆盖QTreeView的文本

时间:2016-01-11 19:50:10

标签: c++ qt

我在使用QTreeView覆盖为QStyledItemDelegate显示的文字时遇到问题。在执行代码后满足某些条件时:

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时,它仍会显示原始文本而不会附加 TEST string

似乎当我致电QStyledItemDelegate::paint(painter, opt, index)时,它忽略了我对opt参数所做的更改。

4 个答案:

答案 0 :(得分:2)

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);
}

答案 1 :(得分:0)

根据代理的类型,我还会尝试覆盖setEditorData()方法甚至createEditor()(您可以在其中添加与模型不同的值)。它比在油漆中进行这样的操作耗时少。

否则,你可以使用类似的东西在你想要的地方绘制文字:

painter->drawText(option.rect, Qt::AlignJustify, text + "_test");

您可能有理由这样做,但如果您想动态添加额外的文字,您的设计似乎有问题吗?

答案 2 :(得分:0)

可能<httpRuntime executionTimeout="3600" maxRequestLength="20480" requestValidationMode="2.0" maxQueryStringLength="2097151"/> <httpRuntime executionTimeout="3600" maxRequestLength="20480" requestValidationMode="2.0" maxQueryStringLength="2097151"/>直接从QStyledItemDelegate::paint选择文字。这就是为什么文本没有改变的原因。您可以通过Qt源调试以确保。

我建议您使用QIdentityProxyModel来做这些事情。代表不是为此类解决方案而设计的。你只需要覆盖1方法。所以你的代码应该是这样的:

index.data( Qt::DisplayRole ).toString()

答案 3 :(得分:0)

如果要更改视图中显示的文本,另一种解决方案是重写displayText()方法。

Qt5示例:

mydelegate.h

virtual QString displayText(const QVariant &value,
                            const QLocale &locale) const override;

mydelegate.cpp

QString MyDelegate::displayText(const QVariant &value,
                                          const QLocale &locale) const
{
    Q_UNUSED(locale)
    QString result = value.toString() + "TEST";
    return result;
}

文档链接:https://doc.qt.io/qt-5/qstyleditemdelegate.html#displayText