Qt, Как мне изменить цвет текста одного элемента QComboBox? (C++)
Я не могу понять, как изменить цвет текста одного конкретного элемента QComboBox. Мне удалось изменить цвет фона элемента:
comboBox->setItemData(i, Qt::green, Qt::BackgroundRole);
(Qt::ForegroundRole
не имел никакого эффекта, Qt 4.6, Ubuntu 10.04)
и мне удалось изменить цвет текста всех элементов с помощью таблицы стилей, но я не могу понять, как изменить цвет текста одного указанного элемента.
Спасибо за вашу помощь!
3 ответа
Это почти как вы предлагаете, но вы должны изменить роль на 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.