2015-04-29 30 views
6

Desidero definire l'evidenziazione dell'elemento selezionato nel menu a discesa di combobox.QComboBox style per l'elemento scelto nell'elenco a discesa

La differenza con altre domande è che non desidero applicare lo stile all'elemento "selezionato" (al passaggio del mouse) .. MA Sono interessato allo stile dell'elemento già scelto.

L'impostazione predefinita è una specie di ticker che viene dipinta sul testo. Voglio che l'oggetto scelto abbia un testo in grassetto e nessuna immagine ticker.

O nel peggiore dei casi a poco shifth il testo a destra per fare il ticker visibile correttamente.

Quello che ho è questa:

enter image description here

Avviso 17 ° elemento che ha ticker sopra il numero 17.

Questo è il mio foglio di stile:

QComboBox 
{ 
    subcontrol-origin: padding; 
    subcontrol-position: top right; 
    selection-background-color: #111; 
    selection-color: yellow; 
    color: white; 
    background-color: QLinearGradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #565656, stop: 0.1 #525252, stop: 0.5 #4e4e4e, stop: 0.9 #4a4a4a, stop: 1 #464646); 
    border-style: solid; 
    border: 1px solid #1e1e1e; 
    border-radius: 5; 
    padding: 1px 0px 1px 20px; 
} 


QComboBox:hover, QPushButton:hover 
{ 
    border: 1px solid yellow; 
    color: white; 
} 

QComboBox:editable { 
    background: red; 
    color: pink; 
} 

QComboBox:on 
{ 
    padding-top: 0px; 
    padding-left: 0px; 
    color: white; 
    background-color: QLinearGradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #2d2d2d, stop: 0.1 #2b2b2b, stop: 0.5 #292929, stop: 0.9 #282828, stop: 1 #252525); 
    selection-background-color: #ffaa00; 
} 

QComboBox:!on 
{ 
    color: white; 
    background-color: QLinearGradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #666, stop: 0.1 #555, stop: 0.5 #555, stop: 0.9 #444, stop: 1 #333); 
} 

QComboBox QAbstractItemView 
{ 
    border: 2px solid darkgray; 
    color: black; 
    selection-background-color: QLinearGradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #111, stop: 1 #333); 
} 

QComboBox::drop-down 
{ 
    subcontrol-origin: padding; 
    subcontrol-position: top right; 
    width: 15px; 
    color: white; 
    border-left-width: 0px; 
    border-left-color: darkgray; 
    border-left-style: solid; /* just a single line */ 
    border-top-right-radius: 3px; /* same radius as the QComboBox */ 
    border-bottom-right-radius: 3px; 
    padding-left: 10px; 
} 

QComboBox::down-arrow, QSpinBox::down-arrow, QTimeEdit::down-arrow, QDateEdit::down-arrow 
{ 
    image: url(:/icons/down_arrow.png); 
    width: 7px; 
    height: 5px; 
} 

stavo cercando per ignorare l'elemento delega:

ui->modeComboBox->setItemDelegate(new QStyledItemDelegate()); 

insieme

QComboBox QAbstractItemView::item:selected style 

O ignorare la vista:

QListView * listView = new QListView(ui->modeComboBox); 

listView->setStyleSheet("QListView::item {        \ 
         border-bottom: 5px solid white; margin:3px; } \ 
         QListView::item:selected {      \ 
         border-bottom: 5px solid black; margin:3px; \ 
         color: black;         \ 
         }"); 
ui->modeComboBox->setView(listView); 

ma in entrambi i casi questo disabilita completamente il momento clou della voce scelto (che è 17 ° articolo)

UPDATE 1

Ho provato a impostare :: articolo: foglio di stile controllato ma non ha aiutato:

QListView * listView = new QListView(ui->modeComboBox); 
listView->setStyleSheet("QListView::item {        \ 
         border-bottom: 5px solid white; margin:3px; } \ 
         QListView::item:selected {      \ 
         border-bottom: 5px solid black; margin:3px; \ 
         color: black; }        \ 
         QListView::item:checked {      \ 
         background-color: green;      \ 
         color: green;}" 
         ); 
ui->modeComboBox->setView(listView); 

Inoltre ho aggiunto che questo foglio di stile solo per essere sicuri:

QComboBox QListView::item:checked { 
background-color: green; 
} 

Il risultato con 17 modalità di verifica è stato (il nero è solo passaggio del mouse):

enter image description here

UPDATE 2

Ok, ero in grado di ch ange il peso del carattere della voce selezionata, ma non riesco a togliere il ticker stupido dalla voce .. Ho sperimentato con il mio foglio di stile e ho scoperto che questi due selettori sono responsabili per lo stile della controllata articoli highlightation:

QWidget:item:selected 
{ 
    border: 0px solid #999900; 
    background: transparent; 
} 
QWidget:item:checked 
{ 
    font-weight: bold; 
} 

Se rimuovo l'oggetto ::: selezionato, allora l'oggetto:: checked non funziona (non mette in grassetto l'elemento selezionato) e il ticker scompare.

Su Qt forum mi hanno consigliato di ridurre in qualche modo lo "spazio per le icone di combobox" .. Non riesco a trovare il selettore che è responsabile di quello ..

Ho la sensazione che il foglio di stile è la magia nera e solo l'scelto può capire ciò che sta accadendo dentro ..

+1

Mai provato, ma hanno hai provato: 'QComboBox QListView :: item: checked {background-color: green; } '? – Iuliu

+0

@iuliu Ho provato che non ha funzionato, ha aggiornato la domanda .. grazie – nayana

+0

@Iuliu il tuo suggerimento mi ha aiutato, ma l'ho impostato su QWidget .. ma ancora non ero in grado di rimuovere il ticker .. – nayana

risposta

2

Ok, dopo molte lotte ho fatto qualche soluzione .. la sua non meglio, la sua non corretta, ma sembra ok ..

ho aggiunto l'effetto grassetto in questo modo (pregiudica altri widget, come le voci di menu verificabili, ma posso vivere con questo):

QWidget:item:selected 
{ 
    border: 0px solid #999900; 
    background: transparent; 
} 
QWidget:item:checked 
{ 
    font-weight: bold; 
} 

Poi quando sto aggiungendo elementi che ho sto anteponendo gli spazi nel loro testo per spostarlo t o il giusto .. Stavo provando tante cose, ma nulla ha interessato il QAbstractItemView all'interno.

questo è il risultato:

enter image description here

-3

Questo ha funzionato per me !:

myComboBox->setStyleSheet("QListView{color:black; background-color:white;}"); 
+0

questo non sembra che sarà evidenzia le voci * selezionate * - imposterà tutto il testo in nero e lo sfondo in bianco – nayana

2

ho avuto successo con meno specifici selettori foglio di stile e "padding-left":

QComboBox:item { 
    padding-left: 20px; /* move text right to make room for tick mark */ 
} 
QComboBox:item:selected { 
    padding-left: 20px; /* move text right to make room for tick mark */ 
    border: 2px solid black; 
} 
QComboBox:item:checked { 
    padding-left: 20px; /* move text right to make room for tick mark */ 
    font-weight: bold; 
} 

(probabilmente qualche inutile duplicazione anche in questo!)

+0

Penso di averlo provato .. forse nel più recente Qt funziona correttamente .. comunque quello che volevo ottenere era avere solo grassetto e no ticker affatto - ma se questo funziona la sua soluzione migliore di aggiungere spazi (non ho tempo per controllare la soluzione), forse se qualcuno qui può provarlo almeno e dare un feedback .. – nayana

+0

Questo risolve il problema ma ha creato un nuovo (Qt 5.9.2). L'altezza di ogni oggetto prende la metà dell'altezza dello schermo. Devo aggiungere un altezza massima ... – firebird631

1

Lo so che è davvero tardi, ma per le persone che hanno lo stesso problema: ho trovato questo a un'altra domanda qui: Not able to hide Choice-Indicator of the QComboBox

Questo dovrebbe nascondere l'indicatore/tick:

QComboBox::indicator{ 
    background-color:transparent; 
    selection-background-color:transparent; 
    color:transparent; 
    selection-color:transparent; 
} 
+0

Sembra davvero buono, ma non ho più il progetto per testarlo .. quindi basta upvotare – nayana