首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重写QStyledItemDelegate中用于QTreeView的文本

重写QStyledItemDelegate中用于QTreeView的文本
EN

Stack Overflow用户
提问于 2016-01-11 19:50:10
回答 4查看 4.8K关注 0票数 6

我在使用QTreeView重写为QStyledItemDelegate显示的文本时遇到了问题。当满足某些条件时,执行以下代码:

代码语言:javascript
复制
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中确认测试是添加到opt.text中的。

但是,当我运行我的程序并查看TreeVuew时,它仍然在显示原始文本,而没有附加测试string

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

EN

回答 4

Stack Overflow用户

发布于 2016-02-04 10:53:14

QStyledItemDelegate::paint()方法的默认实现使用它自己的QStyleOptionViewItem实例,该实例使用来自模型的数据初始化。

来自QT5.4.0源代码:

代码语言:javascript
复制
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()方法,如下所示:

代码语言:javascript
复制
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);
}
票数 2
EN

Stack Overflow用户

发布于 2020-01-28 04:54:56

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

Qt5示例:

代码语言:javascript
复制
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;
}

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

票数 1
EN

Stack Overflow用户

发布于 2016-01-11 22:56:14

根据委托的类型,我还会尝试覆盖setEditorData()方法,甚至createEditor() (您可以在那里添加与模型不同的值)。这比在油漆中做这样的操作要费时少。

否则,您可以使用类似的东西来绘制您想要的文本:

代码语言:javascript
复制
painter->drawText(option.rect, Qt::AlignJustify, text + "_test");

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34729858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档