我在与重写使用QStyledItemDelegate的QTreeView则显示文本的问题.在执行代码后满足某些条件时:
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中确认TEST已添加到opt.text中.
然而,当我运行我的程序,并期待在TreeVuew仍然显示没有附加的测试字符串原文.
看来,当我打电话QStyledItemDelegate ::涂料(画家,选择,指数),它忽略了我的选择参数所做的更改.
最佳答案 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);
}