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

时间:2017-02-19 10:21:25

标签: c++ qt

这是我的问题:

我有一个派生自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();
    }

1 个答案:

答案 0 :(得分:0)

这是我的解决方案。它有效,但我不知道这种方式是否正确。 首先,我在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);
    }
}