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() 不起作用的主要内容,如果未能解决你的问题,请参考以下文章