2010-06-18 14 views
7

No puedo encontrar la manera de cambiar el color del texto de un elemento en particular de un QComboBox. Yo era capaz de cambiar el color de fondo de un elemento:Qt, ¿Cómo cambio el color del texto de un elemento de un QComboBox? (C++)

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

(Qt::ForegroundRole no tuvo ningún efecto en absoluto, Qt 4.6, Ubuntu 10.04)

y yo era capaz de cambiar el color del texto de todos los artículos con una hoja de estilo, pero no puedo entender cómo cambiar el color del texto de un elemento especificado.

Gracias por su ayuda!

Respuesta

3

nunca trataron de hacerlo, pero creo que la única manera de hacerlo sería la de escribir sus propios modelos, heredando QAbstractListModel, reimplementar rowCount() y data() donde se puede establecer el color de cada elemento (utilizando el papel TextColorRole) .

Luego, use QComboBox::setModel() para que el QComboBox lo muestre.

ACTUALIZACIÓN

que era capaz de hacer lo que desee con la solución anterior. Aquí hay un ejemplo simple.

he creado mi propio modelo de lista, heredando 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(); 
    } 
}; 

Ahora es fácil de utilizar este modelo con el cuadro combinado:

comboBox->setModel(new ItemList); 

Lo he probado y que está funcionando bien.

0

No creo que esta sea la solución, pero, si es útil, en algunos casos podría usar QPixmap-s para su cuadro combinado. Eche un vistazo a los métodos QComboBox :: insertItem.

9

Es casi como lo propones, pero debes cambiar la función a Qt::TextColorRole.

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

Parece que este papel es ahora obsoleto el uso de PySide2 y no tiene efecto. Los documentos dicen que use 'ForegroundRole', pero eso tampoco me hizo nada. Quizás esta es la razón de la respuesta de Jérôme – Rafe

Cuestiones relacionadas