【问题标题】:Change QComboBox item text in delegate更改委托中的 QComboBox 项目文本
【发布时间】: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);
}

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

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

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

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

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

【问题讨论】:

  • 为什么要更改委托的 paint() 方法中的项目文本?
  • 如果可能的话,我很乐意在委托的其他地方进行。我尝试了 setEditorData 函数,但只有当鼠标悬停在项目上时才会调用该函数。列表打开后,我需要更改项目的文本和颜色。如果两者都可以在同一个函数中使用,那就更优雅了。但这不是必需的。

标签: c++ qt combobox


【解决方案1】:

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

【讨论】:

  • 这是一个可能的解决方案,是的。但也需要为此目的创建一个新类。它需要获取原始模型,并覆盖 ComboBox 的模型。我现在已经找到了一个自己的解决方案,它非常不同,可能更不优雅,但也有效。我明天会发布。
  • 我刚刚注意到这可能不是一个解决方案,因为我需要在选择项目后立即将文本更改回其原始形式。我怀疑代理是否可以做到这一点。我更新了描述。
  • @TheSHEEEP:啊,如果文本根据选择动态变化,使用代理确实不是最好的方法。当然,您可以通过监听代理中的选择更改信号并相应地发出 dataChanged() 来解决这个问题,但这很丑陋(模型不应该知道选择和视图)
【解决方案2】:

实际答案: 看来我想要做的只是使用委托是不可能的。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多