2010-06-18 9 views
7

Nie mogę wymyślić, jak zmienić kolor tekstu jednego konkretnego elementu QComboBox. Udało mi się zmienić kolor tła elementu:Qt, Jak zmienić kolor tekstu jednego elementu QComboBox? (C++)

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

(Qt::ForegroundRole nie miało wpływu w ogóle, Qt 4.6, Ubuntu 10.04)

i byłem w stanie zmienić kolor tekstu wszystkich elementów z arkusz stylów, ale nie mogę wymyślić, jak zmienić kolor tekstu jednego określonego elementu.

Dzięki za pomoc!

Odpowiedz

3

nigdy nie próbowałem to zrobić, ale myślę, że jedynym sposobem na to byłoby napisać swój własny model, dziedzicząc QAbstractListModel, reimplementing rowCount() i data() gdzie można ustawić kolor dla każdego elementu (przy użyciu TextColorRole rolę) .

Następnie należy użyć QComboBox::setModel(), aby wyświetlić je na QComboBox.

UPDATE

udało mi się to, co chcesz przy użyciu powyższego rozwiązania. Oto prosty przykład.

tworzę własny model listy, dziedzicząc 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(); 
    } 
}; 

Teraz jest łatwy w użyciu tego modelu z pola kombi:

comboBox->setModel(new ItemList); 

próbowałem i to działa dobrze.

0

Nie myśl, że to jest rozwiązanie, ale jeśli jest to przydatne, w niektórych przypadkach możesz użyć QPixmap-ów dla swojego pola kombi. Spójrz na metody QComboBox :: insertItem.

9

To prawie tak, jak proponujesz, ale musisz zmienić rolę na Qt::TextColorRole.

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

Wygląda na to, że ta rola jest już przestarzała za pomocą PySide2 i nie ma żadnego efektu. Doktorzy mówią, że używają 'ForegroundRole', ale to też nic dla mnie nie robiło. Być może to jest powód odpowiedzi Jérôme'a – Rafe