Gerenciamento de Botões com QButtonGroup no Qt

Introdução ao QButtonGroup

O QButtonGroup é um componente do framework Qt que serve como um contêiner para objetos da classe QAbstractButton. Diferente de contêineres visuais como QGroupBox, ele não fornece interface gráfica, focando-se exclusivamente na gestão lógica de botões. Essa classe é particularmente útil ao tratar múltiplos botões com funcionalidades semelhantes, permitindo um controle centralizado e reduzindo a complexidade do código.

Por padrão, o QButtonGroup opera em modo exclusivo, o que significa que apenas um botão dentro do grupo pode estar marcado (checked) por vez. Isso pode ser alterado conforme necessário. As principais operações incluem adicionar e remover botões, acessar seus identificadores e responder a eventos através de sinais.

Adicionando e Removendo Botões

Para inserir um botão no grupo, utiliza-se a função addButton. Seu protótipo é:

void QButtonGroup::addButton(QAbstractButton *button, int id = -1);

O parâmetro button refere-se ao botão a ser adicionado, enquanto id opcional define um identificador personalizado. Se omitido ou definido como -1, o sistema atribui automaticamentee um ID, começando em -2 e decrementando para cada novo botão sem ID explícito.

Exemplos ilustrativos:

QButtonGroup grupo1;
grupo1.addButton(botaoX);  // ID atribuído automaticamente: -2
grupo1.addButton(botaoY);  // ID atribuído automaticamente: -3
grupo1.addButton(botaoZ);  // ID atribuído automaticamente: -4
QButtonGroup grupo2;
grupo2.addButton(botaoA, 5);
grupo2.addButton(botaoB, 10);
grupo2.addButton(botaoC);  // ID automático: -2 (menor ID existente menos 1, mas como o grupo estava vazio antes de adicionar botaoC? Correção: após adicionar botaoA e botaoB com IDs 5 e 10, o ID automático para botaoC seria -2, assumindo que a lógica decrementa a partir do mínimo existente ou padrão. Para clareza, ajuste: grupo2.addButton(botaoC); // ID: -2, já que o grupo tinha IDs 5 e 10, o mínimo é 5, então 5-1=4? No original, a lógica é: se o grupo tem botões, o novo ID automático é o menor ID existente menos 1. Corrijo: após adicionar botaoA (id 5) e botaoB (id 10), o menor ID é 5, então botaoC com id automático seria 4. Para simplificar o exemplo, use uma sequência clara.)
// Corrigindo para refletir a lógica: se o grupo tem IDs explícitos, o automático decrementa a partir do menor.
// Novo exemplo:
QButtonGroup grupo;
grupo.addButton(botao1, 3);
grupo.addButton(botao2);    // ID automático: 2 (menor ID existente é 3, então 3-1=2)
grupo.addButton(botao3, 1); // ID explícito: 1
grupo.addButton(botao4);    // ID automático: 0 (menor ID agora é 1, então 1-1=0)

A remoção de botões é feita com removeButton:

void QButtonGroup::removeButton(QAbstractButton *button);

Este método desvincula o botão especificado do grupo.

Gerenciamento de Identificadores de Botões

Para consultar o ID de um botão, emprega-se a função id, e para redefinir um ID, utiliza-se setId:

int QButtonGroup::id(QAbstractButton *button) const;
void QButtonGroup::setId(QAbstractButton *button, int id);

Esses métodos permitem ajustar ou inspecionar os identificadores conforme a lógica da aplicação.

Obtendo o Botão Atualmente Selecionado

O QButtonGroup oferece funções para acessar o botão que está marcado no momento. Se nenhum botão estiver selecionado, retorna-se um ponteiro nulo:

QAbstractButton *QButtonGroup::checkedButton() const;
int QButtonGroup::checkedId() const;

checkedButton retorna o objeto do botão, enquanto checkedId fornece seu ID correspondente.

Configurando a Exclusividade do Grupo

Por padrão, o QButtonGroup é exclusivo, garantindo que somente um botão esteja marcado por vez. Para desativar essa restrição, chama-se setExclusive com o valor false:

void QButtonGroup::setExclusive(bool exclusive);

Isso permite que múltiplos botões sejam selecionados simultaneamente, útil em cenários como caixas de seleção.

Conectando Sinais e Slots

O QButtonGroup emite diversos sinais para interações com botões, facilitando a execução de ações específicas. Estes sinais podem ser conectados a slots para tratamento de eventos.

Sinais que retornam o botão pressionado como um objeto QAbstractButton:

void QButtonGroup::buttonClicked(QAbstractButton *button);
void QButtonGroup::buttonPressed(QAbstractButton *button);
void QButtonGroup::buttonReleased(QAbstractButton *button);
void QButtonGroup::buttonToggled(QAbstractButton *button, bool checked);

Como esses sinais são sobrecarregados, ao usar ponteiros de função para conexão, pode-se empregar QOverload:

connect(grupoBotoes, QOverload<QAbstractButton *>::of(&QButtonGroup::buttonClicked),
    [listaDeCaptura](QAbstractButton *btn) { /* Lógica de tratamento */ });

Alternativamente, há sinais que retornam o ID do botão:

void QButtonGroup::idClicked(int id);
void QButtonGroup::idPressed(int id);
void QButtonGroup::idReleased(int id);
void QButtonGroup::idToggled(int id, bool checked);

Esses sinais são úteis quando a identificação por ID é mais conveniente do que referenciar o objeto do botão diretamente.

Tags: Qt qbuttongroup qabstractbutton signals-slots cpp

Publicado em 6-7 20:38 por Thomas