2010-06-18 3 views
7

Ich kann nicht herausfinden, wie man die Textfarbe eines bestimmten Artikels einer QComboBox ändert. Ich war in der Lage, die Hintergrundfarbe eines Elements zu ändern:Qt, Wie ändere ich die Textfarbe eines Elements einer QComboBox? (C++)

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

(Qt::ForegroundRole überhaupt keine Wirkung hatte, Qt 4.6, Ubuntu 10.04)

und ich war in der Lage, den Text Farbe aller Elemente ändern mit ein Stylesheet, aber ich kann nicht herausfinden, wie man die Textfarbe eines bestimmten Artikels ändert.

Danke für Ihre Hilfe!

Antwort

3

Ich habe nie versucht, es zu tun, aber ich denke, den einzigen Weg, es zu tun wäre, Ihr eigenes Modell zu schreiben, QAbstractListModel vererben, Neuimplementierung rowCount() und data() wo Sie die Farbe für jedes Element festlegen können (mit der TextColorRole Rolle) .

Verwenden Sie dann QComboBox::setModel(), um das QComboBox anzuzeigen es anzuzeigen.

UPDATE

ich war in der Lage zu tun, was Sie die obige Lösung wollen verwenden. Hier ist ein einfaches Beispiel.

ich meine eigene Liste Modell erstellt, erbt 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(); 
    } 
}; 

Es ist nun leicht, dieses Modell mit dem Kombinationsfeld zu verwenden:

comboBox->setModel(new ItemList); 

ich es versucht und es funktioniert gut.

0

Denken Sie nicht, dass dies die Lösung ist, aber wenn es praktisch ist, könnten Sie in einigen Fällen QPixmap-s für Ihre Combo-Box verwenden. Sehen Sie sich die QComboBox :: insertItem-Methoden an.

9

Es ist fast wie Sie vorschlagen, aber Sie müssen die Rolle zu Qt::TextColorRole ändern.

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

Es sieht so aus, als ob diese Rolle mit PySide2 veraltet ist und keinen Effekt mehr hat. Die Doktoren sagen, 'ForegroundRole' zu ​​verwenden, aber das tat auch nichts für mich. Vielleicht ist das der Grund für Jérômes Antwort – Rafe