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

时间:2010-06-18 14:28:39

标签: c++ qt colors qcombobox

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

comboBox->setItemData(i, Qt::green, Qt::BackgroundRole);

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

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

感谢您的帮助!

3 个答案:

答案 0 :(得分:14)

这几乎与您的建议相同,但您必须将角色更改为Qt::TextColorRole

comboBox->setItemData(0, QBrush(Qt::red), Qt::TextColorRole);  

答案 1 :(得分: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();
   }
};

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

comboBox->setModel(new ItemList);

我尝试了它并且工作正常。

答案 2 :(得分:0)

不要认为这是解决方案,但是,如果它很方便,在某些情况下你可以使用QPixmap-s作为你的组合框。看一下QComboBox :: insertItem方法。