Qt,如何更改QComboBox的一个项目的文本颜色?(C++)

Lin*_*umz 11 c++ qt colors qcombobox

我无法弄清楚如何更改QComboBox的一个特定项目的文本颜色.我能够更改项目的背景颜色:

comboBox->setItemData(i, Qt::green, Qt::BackgroundRole);
Run Code Online (Sandbox Code Playgroud)

(Qt::ForegroundRole完全没有效果,Qt 4.6,Ubuntu 10.04)

我能够用样式表更改所有项目的文本颜色,但我无法弄清楚如何更改一个指定项目的文本颜色.

谢谢你的帮助!

小智 14

这几乎就像你提出的那样,但你必须改变角色Qt::TextColorRole.

comboBox->setItemData(0, QBrush(Qt::red), Qt::TextColorRole);  
Run Code Online (Sandbox Code Playgroud)

  • 看起来这个角色现在使用 PySide2 已经过时并且没有效果。文档说要使用“ForegroundRole”,但这对我也没有任何作用。也许这就是 Jérôme 回答的原因 (4认同)

Jér*_*ôme 4

我从未尝试过这样做,但我想唯一的方法是编写自己的模型,继承QAbstractListModel,重新实现rowCount()以及data()可以为每个项目设置颜色(使用TextColorRole角色)。

然后,使用它QComboBox::setModel()来制作QComboBox显示。

更新

我能够使用上述解决方案做你想做的事情。这是一个简单的例子。

我创建了自己的列表模型,继承QAbstractListModel

class ItemList : public QAbstractListModel
{
   Q_OBJECT
public:
   ItemList(QObject *parent = 0) : QAbstractListModel(parent) {}

   int rowCount(const QModelIndex &parent = QModelIndex()) const { return 5; }
   QVariant data(const QModelIndex &index, int role) const {
      if (!index.isValid())
          return QVariant();

      if (role == Qt::TextColorRole)
         return QColor(QColor::colorNames().at(index.row()));

      if (role == Qt::DisplayRole)
          return QString("Item %1").arg(index.row() + 1);
      else
          return QVariant();
   }
};
Run Code Online (Sandbox Code Playgroud)

现在可以很容易地将这个模型与组合框一起使用:

comboBox->setModel(new ItemList);
Run Code Online (Sandbox Code Playgroud)

我尝试了一下,效果很好。