2016-05-19 16 views
0

Ich möchte ein Kombinationsfeld erstellen, das einige mit Farben verbundene Inhalte auswählt. Ich möchte den Hintergrund des Inhalts die Farbe zeigen. Ich habe dieses Ziel erreicht:Wie kann ich die Kopffarbe eines Kombinationsfelds einstellen?

QList<QString> names; 
QList<QColor> bgColors; 
QList<QColor> fgColors; 
QComboBox* colorComboBox = new QComboBox(); 
for(int i = 0; i < names.size(); ++i) 
{ 
    colorComboBox->addItem(names.at(i), bgColors.at(i)); 
    const QModelIndex idx = colorComboBox->model()->index(i, 0); 
    colorComboBox->model()->setData(idx, bgColors.at(i), Qt::BackgroundColorRole); 
    colorComboBox->model()->setData(idx, fgColors.at(i), Qt::ForegroundRole); 
} 

Das Kombinationsfeld zeigt den Text, den ich will, mit der Hintergrundfarbe I (nicht so zart wie das ColorEditorFactory Beispiel wollen, die nur ein kleines Rechteck neben dem Text zeigt, aber das ist wie ich es wollte).

Was ich brauche:

Sobald eine Reihe/Farbe ausgewählt ist, würde ich die Combo-Box mag die Farbe zu zeigen. Wie jetzt, zeigt das Kombinationsfeld, wenn es geschlossen ist, den Text, aber nicht die Farbe.

enter image description here

Wie kann ich die Farbe des Kopfkombinationsfeld ändern? (Ich mam nennt es Header, aber es kann einen anderen Namen, nicht sicher - der Teil, der über der Tabelle zur Auswahl verwendet und wenn das Kombinationsfeld geschlossen ist)

Edit: Ich habe versucht, ein Stylesheet in einem Steckplatz zu setzen auf currentIndexChanged:

setStyleSheet("QComboBox { color: " + fgColor + 
      "; background-color: " + bgColor + "; }"); 

Ergebnis: änderte er das gesamte Kombinationsfeld in dieser Farbe, die ursprünglichen Farben zu vergessen.

setStyleSheet("QComboBox:!on { color: " + fgColor + 
      "; background-color: " + bgColor + "; }"); 

Ergebnis: es die Farbe schön verändert, wenn nicht gewählt - aber das Highlight und die Header sind grau und schwer zu lesen, ich wünschte, ich es auch ändern könnte. Und wenn ich schwebe, ändert sich die gesamte Combo-Farbe zu der letzten, die ich gesetzt habe.

enter image description here

Die Antwort kann in Sheets sein - wenn ich herausfinden kann, was Eigentum an den Header gilt.

Antwort

1

Wenn ich es gut verstehe, möchten Sie die Farbe des QComboBox-Headers ändern, sobald Sie auf ein Element klicken. Ich habe diesen Code, die für mich funktioniert:

In der CPP-Datei:

myClass::init() // called in the constructor of myClass 
{ 
    names.clear(); 
    names.append("One"); 
    names.append("Two"); 
    names.append("Three"); 

    bgColors.clear(); 
    bgColors.append(QColor("blue")); 
    bgColors.append(QColor("red")); 
    bgColors.append(QColor("green")); 

    fgColors.clear(); 
    fgColors.append(QColor("yellow")); 
    fgColors.append(QColor("magenta")); 
    fgColors.append(QColor("cyan")); 

    colorComboBox = new QComboBox(); 
    colorComboBox->setItemDelegate(new SelectionKillerDelegate); 

    // don't know why but this line seems important; uncomment it, 
    // and the text in the QComboBox (not the items) will be highlighted 
    colorComboBox->setStyleSheet("QComboBox { border-radius: 1px; }"); 

    for(int i = 0; i < names.size(); ++i) 
    { 
     colorComboBox->addItem(names.at(i), bgColors.at(i)); 
     const QModelIndex idx = colorComboBox->model()->index(i, 0); 
     colorComboBox->model()->setData(idx, bgColors.at(i), Qt::BackgroundColorRole); 
     colorComboBox->model()->setData(idx, fgColors.at(i), Qt::ForegroundRole); 
    } 

    connect(colorComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(comboBoxChanged(int))); 
} 


void myClass::comboBoxChanged(int index) 
{ 
    QColor forecolor = (QColor) (colorComboBox->itemData(index, Qt::ForegroundRole).value<QColor>()); 
    QString fgColor = forecolor.name(QColor::HexRgb); 

    QColor backcolor = (QColor) (colorComboBox->itemData(index, Qt::BackgroundRole).value<QColor>()); 
    QString bgColor = backcolor.name(QColor::HexRgb); 

    setStyleSheet("QComboBox { color: " + fgColor + "; background-color: " + bgColor + "; }"); 

} 

In der H-Datei (dank this answer für die Unterklasse von QItemDelegate, die Sie ausgewählte Elemente von QComboBox haben können aber nicht markiert):

class SelectionKillerDelegate : public QItemDelegate 
{ 
    virtual void paint(QPainter *painter, 
     const QStyleOptionViewItem &option, 
     const QModelIndex &index) const override 
    { 
     QStyleOptionViewItem myOption = option; 
     myOption.state &= (~QStyle::State_Selected); 
     QItemDelegate::paint (painter, myOption, index); 
    } 
}; 

private : 
    QComboBox* colorComboBox; 
    QList<QString> names; 
    QList<QColor> bgColors; 
    QList<QColor> fgColors; 

public slots : 
    void comboBoxChanged(int); 

Ich hoffe, es wird auch für Sie arbeiten.

+0

Das ist großartig! Ich hatte es schließlich mit Stylesheets funktioniert, aber ich denke, das ist einfacher. Ich kann die 'setStyleSheet (" QComboBox {border-radius: 1px;} ");' Anforderung einfach nicht verstehen - weil sie sowieso im Change-Slot überschrieben wird ... – Thalia

+0

Ich auch nicht, aber merken Sie das Gleiche wie mich? Wenn Sie diese Zeile kommentieren, haben Sie den QComboBox-Text wieder hervorgehoben ... Ich habe noch nicht die Fähigkeiten, dieses Verhalten zu verstehen haha ​​ – IAmInPLS

+0

Der Text in der QComboBox? das ist immer noch für mich markiert - jetzt, wo du es erwähnt hast, habe ich es in das slot style sheet eingefügt und es entfernt Hervorhebung !!!:-) Nochmals vielen Dank :-) – Thalia