在委托中更改QComboBox项目文本

时间:2013-11-26 12:02:09

标签: c++ qt combobox

我希望根据某些条件更改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);
}

只是解释一下,在我的实际代码中,我有一些条件,所以我不想修改每个项目。

但是,我无法弄清楚如何更改显示的文字。我尝试设置 text newOption 属性,但似乎这与显示的实际文本无关。

此外,我需要在选择项目后立即将文本更改回原始格式。

我发现p_index.data().toString()给了我显示的文字,但这并没有帮我修改它。我需要的是一种简单的方法来修改QLabel的文本属性(或QComboBox用于显示项目文本的任何内容),而不会影响模型本身。

我知道会有解决方法,例如从组合框中删除我想要更改的项目并插入更改的版本,但我希望有一种更简单的方法。

2 个答案:

答案 0 :(得分:1)

在模型顶部添加代理模型并更改其data()方法对我来说似乎是最简单的解决方案。 有QIdentityProxyModel您可以简单地子类化并覆盖data()。使用原始模型作为代理模型的源,将代理模型用作组合框的模型。

答案 1 :(得分:0)

实际答案: 似乎我想做的事情根本就是不可能只使用委托。

解决方法: 所以我做的是使用事件过滤器在下拉列表打开之前为项目文本设置正确的后缀以及它们的颜色(收听MousePressed事件)。

为了确保在选择项目时删除了文本后缀,我在事件过滤器类中添加了一个插槽,该插槽必须连接到activated()的{​​{1}}信号。然后该槽检查后缀并将其删除。

这不是一件好事,但至少它只需要一个额外的类和两行代码来使用。它应该独立于所使用的数据模型。