【发布时间】:2013-11-26 12:02:08
【问题描述】:
我想根据某些条件更改QComboBox 显示的项目的颜色和文本,但不更改模型本身的数据。
我想出了如何改变颜色,这很容易:
//---------------------------------------------------------------------------------
void
ComboPriorityDelegate::paint(QPainter* p_painter, const QStyleOptionViewItem& p_option, const QModelIndex& p_index) const
{
QStyleOptionViewItem newOption(p_option);
// Set the color
newOption.palette.setColor(QPalette::Text, QColor(255, 0, 0));
QItemDelegate::paint(p_painter, newOption, p_index);
}
只是说明一下,在我的实际代码中,我有一些条件,所以我不想修改每个项。
但是,我无法弄清楚如何更改显示的文本。我尝试设置 newOption 的 text 属性,但这似乎与显示的实际文本无关。
此外,我需要在选择项目后立即将文本更改回其原始形式。
我发现p_index.data().toString() 给了我显示的文本,但这并不能帮助我修改它。我需要的是一种简单的方法来修改 QLabel 的文本属性(或 QComboBox 用于显示项目文本的任何内容),而不影响模型本身。
我知道会有一些解决方法,例如从组合框中删除我想要更改的项目并插入更改后的版本,但我希望有更简单的方法。
【问题讨论】:
-
为什么要更改委托的
paint()方法中的项目文本? -
如果可能的话,我很乐意在委托的其他地方进行。我尝试了 setEditorData 函数,但只有当鼠标悬停在项目上时才会调用该函数。列表打开后,我需要更改项目的文本和颜色。如果两者都可以在同一个函数中使用,那就更优雅了。但这不是必需的。