Dominando a Aparência do QComboBox com PyQt5 e Stylesheets

Introdução à Customização de Widgets PyQt5
O PyQt5, um robusto conjunto de bindings Python para o framework Qt, é amplamente utilizado para criar interfaces gráficas de usuário (GUIs) ricas e funcionais. Dentro de sua vasta biblioteca de widgets, o QComboBox
se destaca como um componente essencial, permitindo aos usuários selecionar uma opção a partir de uma lista suspensa. Embora sua funcionalidade padrão seja clara, a aparência visual pode precisar de ajustes para se alinhar à identidade visual de uma aplicação ou para melhorar a experiência do usuário (UX).
É aqui que entram as Qt Style Sheets (QSS). De forma análoga ao CSS para desenvolvimento web, as QSS oferecem um mecanismo poderoso para controlar a aparência dos widgets Qt, incluindo o QComboBox
. Utilizando QSS, é possível modificar cores, bordas, preenchimento, fontes e até mesmo substituir elementos gráficos como a seta do drop-down.
Entendendo Qt Style Sheets (QSS) para QComboBox
A sintaxe das Qt Style Sheets é intencionalmente similar à do CSS, tornando-a familiar para desenvolvedores web. Uma regra QSS básica consiste em um seletor e uma declaração. O seletor define qual(is) widget(s) a regra afetará, e a declaração, entre chaves {}
, contém pares de propriedade: valor;
que definem os estilos a serem aplicados.
Por exemplo:
QComboBox { background-color: #f0f0f0; color: black; border: 1px solid gray; }
Este exemplo aplica um fundo cinza claro, texto preto e uma borda cinza a todas as instâncias de QComboBox
e suas subclasses na aplicação. As QSS suportam diversos tipos de seletores:
- Type Selector: Seleciona todas as instâncias de uma classe específica (e subclasses), como
QComboBox
. - ID Selector: Seleciona uma instância específica de widget que teve seu
objectName
definido. Se um QComboBox temsetObjectName("meuCombo")
, pode ser estilizado com#meuCombo { ... }
. - Selectors de Sub-Controles: Permitem estilizar partes específicas de um widget complexo, como a seta ou a lista suspensa do QComboBox.
Para aplicar QSS em PyQt5, você pode usar o método setStyleSheet()
do widget específico ou aplicá-lo globalmente à instância da aplicação (QApplication
).
Customizando o QComboBox: Seletores Essenciais e Propriedades
Para customizar efetivamente um QComboBox
, é crucial conhecer os seletores específicos para suas diferentes partes.
Estilizando o QComboBox Principal
O seletor de tipo QComboBox
estiliza a caixa principal do widget.
Seletor: QComboBox
Propriedades Comuns:
background-color
: Cor de fundo.color
: Cor do texto do item selecionado.border
: Define a borda (espessura, estilo, cor).border-radius
: Arredonda os cantos da borda.padding
: Espaçamento interno.height
: Altura do componente.
Exemplo QSS:
QComboBox { border: 1px solid #cccccc; border-radius: 4px; padding-left: 10px; background-color: white; height: 28px; }
Modificando o Botão Drop-down (Área da Seta)
Esta área contém a seta que abre a lista suspensa.
Seletor: QComboBox::drop-down
Propriedades Comuns:
subcontrol-origin
: Define a referência para a posição (geralmentepadding
).subcontrol-position
: Posiciona o sub-controle (ex:top right
).width
: Largura da área da seta.border
: Borda específica para esta área.border-top-right-radius
,border-bottom-right-radius
: Para combinar com o arredondamento do QComboBox principal.
Exemplo QSS:
QComboBox::drop-down { border: none; subcontrol-origin: padding; subcontrol-position: top right; width: 20px; }
Alterando a Seta Drop-down
É possível substituir a seta padrão por uma imagem customizada.
Seletor: QComboBox::down-arrow
Propriedades Comuns:
image
: Caminho para o arquivo de imagem da seta (ex:url(caminho/para/seta.png)
).width
,height
: Dimensões da imagem da seta.
Também é possível ajustar a seta quando a lista está aberta usando o pseudo-estado :on
.
Seletor Estado Aberto: QComboBox::down-arrow:on
Exemplo QSS:
QComboBox::down-arrow { image: url(icons/arrow-down.svg); width: 12px; height: 12px; } QComboBox::down-arrow:on { image: url(icons/arrow-up.svg); /* Pode mudar a imagem ou posição */ }
Personalizando a Lista Suspensa (Popup)
A lista que aparece ao clicar no QComboBox é, na verdade, um `QAbstractItemView` (frequentemente um `QListView`), e pode ser estilizada separadamente.
Seletor para a View: QComboBox QAbstractItemView
ou QComboBox QListView
Propriedades Comuns (View):
background-color
: Cor de fundo da lista.border
: Borda da lista suspensa.selection-background-color
: Cor de fundo do item selecionado (quando navegado pelo teclado/mouse hover, não necessariamente o item *atual* do QComboBox).
Seletor para os Itens: QComboBox QListView::item
Propriedades Comuns (Item):
padding
: Espaçamento interno dos itens.height
: Altura de cada item.color
: Cor do texto dos itens.
Seletor Item Hover: QComboBox QListView::item:hover
Exemplo QSS:
QComboBox QListView { background-color: white; border: 1px solid #cccccc; outline: 0px; /* Remove foco visual indesejado */ } QComboBox QListView::item { padding: 5px 10px; height: 25px; } QComboBox QListView::item:selected { background-color: #e0e0e0; color: black; } QComboBox QListView::item:hover { background-color: #f5f5f5; }
Nota Importante: Estilizar o item que corresponde à seleção *atual* do QComboBox dentro da lista suspensa pode ser complexo apenas com QSS. Para essa finalidade específica, usar um `QStyledItemDelegate` customizado costuma ser uma abordagem mais robusta e recomendada.
Dicas e Boas Práticas para Estilizar QComboBox
- Comente seu QSS: Facilita a manutenção e compreensão do código de estilos.
- Teste Multiplataforma: A renderização pode variar ligeiramente entre sistemas operacionais. Teste sua aplicação se a consistência visual for crítica.
- Consulte a Documentação Oficial do Qt: É a fonte mais completa e confiável para todos os seletores, sub-controles, pseudo-estados e propriedades disponíveis.
- Use Qt Designer: Para prototipar e testar estilos visualmente antes de implementá-los no código.
- Organização: Para estilos complexos, considere carregar QSS de arquivos `.qss` externos em vez de strings longas no código Python.
Conclusão
Customizar a aparência do QComboBox
com Qt Style Sheets em PyQt5 é uma maneira eficaz de aprimorar a estética e a usabilidade das suas aplicações desktop. Ao compreender os seletores específicos — QComboBox
, ::drop-down
, ::down-arrow
, QListView
, e QListView::item
— e as propriedades QSS, você ganha controle granular sobre cada aspecto visual deste widget. Embora haja nuances, como a estilização do item atualmente selecionado na lista, as QSS oferecem flexibilidade imensa para criar interfaces que não são apenas funcionais, mas também visualmente coesas e atraentes.
