2012-11-12 10 views
6

Potrzebuję stworzyć menu, które zmienia tło QWidget. Chciałbym umieścić QIcon reprezentujący wybrany kolor w QActions, które zapełnia QMenu. Nie chciałbym wyskakiwać z Photoshopa i malować ikon ręcznie. Czy można zaprogramować prostą ikonę wypełnioną określonym kolorem? W ten sposób mogę mieć dowolną liczbę QActions w razie potrzeby i nie będę musiał tworzyć całej garści ikon w Photoshopie. \Proste wypełnianie kolorem QIcons w Qt

Odpowiedz

12

Możesz skonstruować QIcon z QPixmap. QPixmap może być skonstruowany przy danym rozmiarze, a następnie wypełniony kolorem za pomocą "wypełnienia".

Na przykład aby stworzyć czerwony 100x100 ikonę:

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

to wypełnią tylko przezroczyste części obrazu, prawda? Czy można to wykorzystać do wypełnienia przezroczystych części QIcon kolorem? – SexyBeast

+0

Obawiam się, że nie rozumiem. Ten kod tworzy zupełnie nową ikonę, która jest solidnym czerwonym kwadratem. – cgmb

5

Tylko zorientowali się, jak zmienić kolor z ikoną do jakiegokolwiek innego koloru. Dlatego obraz ikony musi składać się z jednego koloru ciało stałe (tutaj: „czerni”), które mogą być przekształcane za pomocą pixmapę i jego zdolność maskowania, w innym kolorze (na przykład „Red”):

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, choć createMaskFromColor (QColor ("przezroczysty"), Qt.MaskInColor) działa lepiej dla mnie – falkb

+0

Temat jest oznaczony C++, ale nie jest to poprawny kod C++. Chciałbym go edytować, ale recenzenci odrzucili go z powodów, których nie znam. Poza tym rozwiązanie działało dla mnie po przeniesieniu go do C++. – bns

+0

Myślę, że masz rację - nie rozpoznałem, że pytanie było związane z C++ - ale uważam też, że nie ma to na celu zmiany już istniejącej odpowiedzi, która ... I nie wiem, czy twój kod jest stabilny - więc nie mogę tego zaakceptować dla siebie. Myślę, że powinieneś odpowiedzieć sobie! Dzięki za podpowiedź. – Henhuy