C++ 更改委托中的QComboBox项文本
我想根据某些条件更改C++ 更改委托中的QComboBox项文本,c++,qt,combobox,C++,Qt,Combobox,我想根据某些条件更改QComboBox显示的项目的颜色和文本,但不更改模型本身中的数据 我想出了如何改变颜色,这相当简单: //--------------------------------------------------------------------------------- void ComboPriorityDelegate::paint(QPainter* p_painter, const QStyleOptionViewItem& p_option, const Q
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);
}
只是想解释一下,在我的实际代码中,我有一些条件,所以我不想修改每个项目
但是,我不知道如何更改显示的文本。我尝试设置
的文本属性,但这似乎与实际显示的文本无关
此外,我需要在选择项目后立即将文本更改回其原始形式
我发现p_index.data().toString()
提供了显示的文本,但这无助于我修改它。我需要的是一种简单的方法来修改QLabel
(或QComboBox
用于显示项目文本的任何内容)的文本属性,而不影响模型本身
我知道会有一些解决办法,比如从组合框中删除我想要更改的项目并插入更改的版本,但我希望有一种更简单的方法。在模型上添加代理模型并更改其数据()
方法对我来说似乎是最简单的解决方案。
您可以简单地将其子类化并覆盖data()
。将原始模型用作代理模型的源,将代理模型用作组合框的模型。实际答案:
似乎我想做的仅仅是使用委托是不可能的
解决方法:
因此,我所做的是在下拉菜单打开之前,使用事件过滤器为项目文本设置正确的后缀及其颜色(收听MousePressed
event)
为了确保选中某个项目时删除文本后缀,我在事件筛选器类中添加了一个插槽,该插槽必须连接到QComboBox的activated()
信号。然后,该插槽检查后缀并将其删除
这不是一件好事,但至少它只需要一个额外的类和两行代码即可使用。它应该独立于所使用的数据模型。为什么要更改代理的paint()
方法中的项文本?如果可能,我很乐意在代理的其他地方进行更改。我尝试了setEditorData函数,但只有当鼠标悬停在该项上时才会调用该函数。一旦列表打开,我需要更改项目的文本和颜色。如果两者都能在同一个函数中实现,那么它将更加优雅。但这不是一个要求。这是一个可能的解决方案,是的。但也需要为此目的创建一个新类。它需要获取原始模型,并覆盖组合框的模型。我现在已经找到了自己的解决方案,这是非常不同的,可能更不优雅,但也工作。我将在明天发布。我只是注意到这可能不是一个解决方案,因为我需要在选择项目后立即将文本更改回其原始形式。我怀疑这在代理中是可能的。我更新了描述。@TheSHEEEP:啊,如果文本根据选择动态变化,使用代理确实不是最好的方法。当然,您可以通过在代理中监听选择更改的信号并相应地发出dataChanged()来解决这个问题,但这很难看(模型不应该知道选择,因此也不应该知道视图)