为QTreeView覆盖QStyledItemDelegate中的文本

问题描述 投票:5回答:4

我在使用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);
}

我在调试器中确认将TEST添加到opt.text。但是,当我运行程序并查看TreeVuew时,它仍显示原始文本,而未附加TEST string

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

c++ qt
4个回答
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);
}

0
投票

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

否则,您可以使用类似的方法在所需的位置绘制文本:

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

您可能有这样做的理由,但是如果您想即时添加额外的文本,似乎在设计中出现了问题?


0
投票

可能QStyledItemDelegate::paint直接从index.data( Qt::DisplayRole ).toString()中选择文本。这就是为什么文本不会更改的原因。您可以确定通过Qt源进行调试。

我建议您使用QIdentityProxyModel来做这些事情。代表不是为此类解决方案设计的。您只需要重写1方法。因此您的代码应如下所示:

QIdentityProxyModel

0
投票

如果您要更改视图中显示的文本,替代方法是重写class MyProxyModel : public QIdentityProxyModel { // ... }; QVariant MyProxyModel::data(const QModelIndex &index, int role) const override { if ( /*Conditions when you don't want to change source text*/ ) return QIdentityProxyModel::data( index, role ); // Extra check for editors or other roles to return original data if ( role == Qt::EditRole || role != Qt::DisplayRole ) return QIdentityProxyModel::data( index, role ); const auto sourceIndex = mapToSource( index ); const auto originalText = sourceModel()->data( sourceIndex, Qt::DisplayRole ).toString(); const auto newText = QString( "%1 [TEST]" ).arg( originalText ); return newText; } // Usage auto yourModel = YourOriginalModel( this ); auto proxy = MyProxyModel( this ); proxy->setSourceModel( yourModel ); view->setModel( proxy ); 方法。

Qt5示例:

displayText()

doc链接: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; }

© www.soinside.com 2019 - 2024. All rights reserved.