Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 更改委托中的QComboBox项文本_C++_Qt_Combobox - Fatal编程技术网

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()来解决这个问题,但这很难看(模型不应该知道选择,因此也不应该知道视图)