QT - Cambio de color en icono con Qt

 
Vista:
sin imagen de perfil
Val: 2
Ha aumentado 1 puesto en QT (en relación al último mes)
Gráfica de QT

Cambio de color en icono con Qt

Publicado por Sandra (1 intervención) el 25/03/2021 13:10:28
Hola, estoy utilizando Qt y c++ en visual studio, y necesito cambiar el color de los iconos dinamicamente, por ejemplo, tengo un botón con un icono y que este icono segun lo que yo le diga sea de un color o de otro.

¿Alguien sabe más o menos como prodria hacerlo?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Cambio de color en icono con Qt

Publicado por Rolando José (9 intervenciones) el 27/03/2025 03:01:14
como no nos dist un codigo que pudieramos mirar o corregir, hice un demo de como un boton puede cambiar el icono de la ventana, cambiar el icono de un boton no es muy diferente.

los iconos por lo general se toman de imagenes de 32x32 guardadas en formato PNG o ICO, sinembargo se puede crear una imagen vacia y en este caso de demostracion crear los iconos como las banderas de los paises pintando sobre la imagen en blanco y finalmente los botones cargan las imagenes a su uso como icono de y/o ventana que no es muy diferente a la imagen de un boton.

Para poderte ayudar mejor, debes compartir el codigo, de esa forma podremos responder mas rapido, que sin codigo, pueden pasar hasta 20 años para que se conteste una pregunta.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
from PyQt6.QtWidgets import QApplication, QDialog, QVBoxLayout, QPushButton
from PyQt6.QtGui import QIcon, QPixmap, QPainter
from PyQt6.QtCore import Qt
 
class IconWindow(QDialog):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("cambiar icono")
        self.setGeometry(500, 500, 400, 200)
        self.setStyleSheet("background-color: #AAAAAA;")
        layout = QVBoxLayout()
 
        self.btn_mexico = QPushButton("MEXICO")
        self.btn_colombia = QPushButton("COLOMBIA")
        self.btn_mexico.clicked.connect(self.set_mexico_icon)
        self.btn_colombia.clicked.connect(self.set_colombia_icon)
        layout.addWidget(self.btn_mexico)
        layout.addWidget(self.btn_colombia)
        self.setLayout(layout)
 
    def set_mexico_icon(self):
        pixmap = QPixmap(32, 32)
        pixmap.fill(Qt.GlobalColor.black)
 
        painter = QPainter(pixmap)
        painter.fillRect(5, 5, 5, 25, Qt.GlobalColor.green)
        painter.fillRect(10, 0, 10, 30, Qt.GlobalColor.white)
        painter.fillRect(20, 0, 10, 30, Qt.GlobalColor.red)
        painter.end()
        self.setWindowIcon(QIcon(pixmap))
 
    def set_colombia_icon(self):
        pixmap = QPixmap(40, 40)
        pixmap.fill(Qt.GlobalColor.gray)
        painter = QPainter(pixmap)
        painter.fillRect(0, 0, 40, 20, Qt.GlobalColor.yellow)
        painter.fillRect(0, 20, 40, 10, Qt.GlobalColor.blue)
        painter.fillRect(0, 30, 40, 10, Qt.GlobalColor.red)
        painter.end()
        self.setWindowIcon(QIcon(pixmap))
app = QApplication([])
window = IconWindow()
window.show()
app.exec()

En tkinter es mucho mas facil y requiere muchas menos lineas de codigo, por ejemplo este simple programa en tkinter se escribe en menos de la mitad de las lineas de codigo y se puede ejecutar en Windows, Linux y Mac con identico aspecto en cualquier Sistema Operativo, lo oto es que PyQT, crea ejecutables 6 veces mas grandes, pues suma mas de 80 Mb la librerias frente a los 8 Mb de Tkinter.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import tkinter as tk
from PIL import Image, ImageDraw, ImageTk
 
def create_mexico_icon():
    # Crear imagen de 32x32 píxeles
    img = Image.new('RGB', (30, 30), '#000000')
    draw = ImageDraw.Draw(img)
    # Franja verde (5-30px vertical)
    draw.rectangle((5, 5, 10, 30), fill='#00FF00')
    # Franja blanca (10-20px vertical)
    draw.rectangle((10, 0, 20, 30), fill='#FFFFFF')
    # Franja roja (20-30px vertical)
    draw.rectangle((20, 0, 30, 30), fill='#FF0000')
    return ImageTk.PhotoImage(img)
 
def create_colombia_icon():
    # Crear imagen de 40x40 píxeles
    img = Image.new('RGB', (40, 40), '#AAAAAA')
    draw = ImageDraw.Draw(img)
    # Franja amarilla (0-20px vertical)
    draw.rectangle((0, 0, 40, 20), fill='#FFFF00')
    # Franja azul (20-30px vertical)
    draw.rectangle((0, 20, 40, 30), fill='#0000FF')
    # Franja roja (30-40px vertical)
    draw.rectangle((0, 30, 40, 40), fill='#FF0000')
    return ImageTk.PhotoImage(img)
 
root = tk.Tk()
root.withdraw()
d = tk.Toplevel(bg='#AAAAAA')
d.geometry('400x200+500+500')
d.title('cambiar icono')
btn_mexico = tk.Button(d, text='MEXICO', command=lambda: d.iconphoto(True, create_mexico_icon()))
btn_colombia = tk.Button(d, text='COLOMBIA', command=lambda: d.iconphoto(True, create_colombia_icon()))
btn_mexico.pack(side='top', pady=10, padx=10)
btn_colombia.pack(side='top', pady=10, padx=10)
root.mainloop()
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar