我在使用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);
}我在debbugger中确认测试是添加到opt.text中的。
但是,当我运行我的程序并查看TreeVuew时,它仍然在显示原始文本,而没有附加测试string。
当我调用QStyledItemDelegate::paint(painter, opt, index)时,它似乎忽略了对opt参数所做的更改。
发布于 2016-02-04 10:53:14
QStyledItemDelegate::paint()方法的默认实现使用它自己的QStyleOptionViewItem实例,该实例使用来自模型的数据初始化。
来自QT5.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);
}发布于 2020-01-28 04:54:56
如果要更改视图中显示的文本,另一种解决方案是重写displayText()方法。
Qt5示例:
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
发布于 2016-01-11 22:56:14
根据委托的类型,我还会尝试覆盖setEditorData()方法,甚至createEditor() (您可以在那里添加与模型不同的值)。这比在油漆中做这样的操作要费时少。
否则,您可以使用类似的东西来绘制您想要的文本:
painter->drawText(option.rect, Qt::AlignJustify, text + "_test");你可能有这样做的理由,但如果你想动态添加额外的文本,你的设计似乎有问题吗?
https://stackoverflow.com/questions/34729858
复制相似问题