我无法弄清楚如何更改 QComboBox 的一个特定项目的文本颜色。我能够更改项目的背景颜色:
comboBox->setItemData(i, Qt::green, Qt::BackgroundRole);
(Qt::ForegroundRole
完全没有效果,Qt 4.6,Ubuntu 10.04)
并且我能够使用样式表更改所有项目的文本颜色,但我无法弄清楚如何更改一个指定项目的文本颜色。
感谢您的帮助!
这几乎就像您提出的那样,但您必须将角色更改为Qt::TextColorRole
。
comboBox->setItemData(0, QBrush(Qt::red), Qt::TextColorRole);
我从未尝试过这样做,但我想唯一的方法是编写自己的模型,继承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);
我试过了,它工作正常。
不要认为这是解决方案,但是,如果方便的话,在某些情况下,您可以将 QPixmap-s 用于您的组合框。看看 QComboBox::insertItem 方法。