Qt。如果我在 QStyledItemDelegate 中定义了 paint() 方法,则方法 displayText() 不起作用

Posted

技术标签:

【中文标题】Qt。如果我在 QStyledItemDelegate 中定义了 paint() 方法,则方法 displayText() 不起作用【英文标题】:Qt. Method displayText() doesn't work if I defined paint() method in QStyledItemDelegate 【发布时间】:2017-02-19 10:21:24 【问题描述】:

这是我的问题:

我有一个派生自 QStyledItemDelegate 的委托,我在其中定义了方法

QWidget * createEditor(QWidget * parent, const QStyleOptionViewItem&option, const QModelIndex&index) const;
void setEditorData(QWidget * editor, const QModelIndex&index)const;
void setModelData(QWidget * editor, QAbstractItemModel * model, const QModelIndex&index) const;
QString displayText(const QVariant & value, const QLocale & locale) const;

最后一个方法-displayText()-让我在西班牙语言环境中格式化数字的输出,它工作正常。

但是,在那之后,我从第一个委托的继承中创建了另一个委托。在这个类中,我只定义了下一个方法:

void paint( QPainter *painter,const QStyleOptionViewItem &option, const QModelIndex &index ) const;
QSize sizeHint( const QStyleOptionViewItem &option, const QModelIndex &index ) const;

问题是那些代表正在工作的列并没有显示像 displayText() 那样格式正确的数字。

同样,如果我在同一个类中定义了这两个方法(displayText() 和 paint()),那么 displayText() 不起作用。

编辑:

这些是方法的实现:

基类中的displayText():

QString Delegado::displayText(const QVariant & value, const QLocale & locale) const

    qDebug()<<"Valor: "<<value.toString()<<"locale - "<<locale;
    return locale.toString(value.toDouble(),'f',2);

派生类中的paint()和sizeHint()(我已经尝试在基类中实现这些方法,结果是一样的)

    void Delegado2::paint( QPainter *painter,const QStyleOptionViewItem &option, const QModelIndex &index ) const

    if (index.isValid())
    
        painter->save();
        painter->setPen(QColor(255,255,170));
        painter->setBrush(QColor(255,255,170));
        painter->drawRect(option.rect);
        painter->setPen(Qt::gray);
        painter->drawText(option.rect, Qt::AlignCenter, QString::number(index.data().toDouble()));
        painter->restore();
        QStyledItemDelegate::paint(painter, option, index);
    
    else
        QStyledItemDelegate::paint(painter, option, index);


    QSize Delegado2::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
    
        return option.rect.size();
    

【问题讨论】:

你是否从你的paint实现内部调用父类QStyledItemDelegate::paint()实现? 是的。即使paint()和dispayText()方法在同一个类中,displayText()也不起作用。 请提供您的paint()和displayText()方法的实现 我已经编辑了帖子以显示方法。谢谢 正如我上面写的,如果你调用 Delegado::paint(painter, option, index); 会发生什么,即使是 index.valid() == true ? 【参考方案1】:

这是我的解决方案。它有效,但我不知道这种方式是否正确。 首先,我在 Delegado 中定义了 displayText() 方法(派生自 QStyledItemDelegate)。这是我的基类,它可以让我以我的语言环境格式获取数字。

在 thar 之后,在 Delegado2(源自 Delegado)中,我定义了 paint() 和 sizeHint() 方法。 paint() 使用 displayText() 方法绘制文本,如下:

painter->drawText(option.rect, Qt::AlignCenter|Qt::AlignRight, displayText(index.data(),QLocale::system()));

这是基类(Delegado)中的 displayText() 方法:

QString Delegado::displayText(const QVariant & value, const QLocale & locale) const

    return locale.toString(value.toDouble(),'f',2);

这是派生类(Delegado2)中的paint()方法

void Delegado2::paint( QPainter *painter,const QStyleOptionViewItem &option, const QModelIndex &index ) const

    if (index.isValid())
    
        painter->save();
        painter->setPen(QColor(255,240,170));
        painter->setBrush(QColor(255,240,170));
        painter->drawRect(option.rect);
        painter->setPen(Qt::magenta);
        painter->drawText(option.rect, Qt::AlignCenter|Qt::AlignRight, displayText(index.data(),QLocale::system()));
        painter->restore();
    
    else
    
        QStyledItemDelegate::paint(painter, option, index);
    

【讨论】:

以上是关于Qt。如果我在 QStyledItemDelegate 中定义了 paint() 方法,则方法 displayText() 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何运行使用 Qt 代码的 .py 文件?

qt 如何设置tab键, 显示箭头, 不是代表空格的点

Qt 应用程序不使用 qrc 前缀

Qt - 网络接口统计

Qt快速部署,运行时空窗口

Qt动画椭圆沿圆