2012-11-12 23 views
6

Devo creare un menu che modifichi lo sfondo di un QWidget. Mi piacerebbe mettere un QIcon che rappresenta il colore selezionato nelle QActions che popola il QMenu. Mi piacerebbe non dover estrarre Photoshop e dipingere le icone manualmente. È possibile programmare un'icona semplice riempita con un determinato colore? In questo modo posso avere un numero arbitrario di QActions se necessario, e non dovrò creare un sacco di icone in Photoshop. \Riempimento colore semplice QIcons in Qt

risposta

12

È possibile costruire un QIcon da una QPixmap. QPixmap può essere costruito con una data dimensione, quindi riempito con un colore usando 'fill'.

Ad esempio, per creare un 100x100 un'icona rossa:

QPixmap pixmap(100,100); 
pixmap.fill(QColor("red")); 
QIcon redIcon(pixmap); 
+0

Questo riempirà solo le parti trasparenti dell'immagine, giusto? Voglio dire, può essere usato per riempire le parti trasparenti di un QIcon con il colore? – SexyBeast

+0

Ho paura di non capire. Questo codice crea un'icona completamente nuova che è un quadrato rosso solido. – cgmb

5

appena capito come cambiare colore da icona per qualsiasi altro colore. Pertanto, l'immagine dell'icona deve essere costituito da un colore solido (qui: 'nero'), che può essere convertito utilizzando una mappa di pixel e la sua capacità di mascheramento in un altro colore (come 'rosso'):

pixmap = QPixmap(filename) 
mask = pixmap.createMaskFromColor(QColor('black'), Qt.MaskOutColor) 
pixmap.fill((QColor('red'))) 
pixmap.setMask(mask) 

btNew = QToolButton() 
btNew.setIcon(QIcon(pixmap)) 
+0

Cool, anche se createMaskFromColor (QColor ('transparent'), Qt.MaskInColor) funziona meglio per me – falkb

+0

L'argomento è codificato con C++, ma questo non è un codice C++ valido. Vorrei modificarlo ma i revisori l'hanno rifiutato per ragioni che non conosco. Oltre a questo, la soluzione ha funzionato per me dopo averlo trasferito su C++. – bns

+0

Penso che tu abbia ragione - non ho riconosciuto che la domanda era legata al C++ - ma penso anche che non è destinato a cambiare una risposta già esistente più che ... E non so se il tuo codice è stabile - quindi non posso accettarlo per me stesso. Penso che dovresti risponderti! Grazie per il suggerimento. – Henhuy