更改委托中的QComboBox项目文本

Change QComboBox item text in delegate

本文关键字:QComboBox 项目 文本      更新时间:2023-10-16

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

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

但是,我不知道如何更改显示的文本。我尝试设置newOptiontext属性,但这似乎与显示的实际文本无关。

此外,一旦选择了项目,我需要将文本更改回其原始形式。

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

我知道会有一些变通办法,比如从组合框中删除我想更改的项目,然后插入一个更改后的版本,但我希望有一个更简单的方法。

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

实际答案:我想做的事情似乎不可能仅仅使用委托。

解决方法:因此,我所做的是使用事件过滤器在下拉菜单打开之前为项目文本设置正确的后缀及其颜色(听MousePressed事件)。

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

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