Pergunta

Não sei como formular minha pergunta desta vez ...

Tenho meu aplicativo com um QDialog como janela principal. O aplicativo está obtendo valores diferentes como temperatura, umidade e assim por diante de uma máquina remota.

Para o desenvolvimento, adicionei uma caixa de grupo com diferentes widgets para simular esses valores. Tenho limites diferentes para enviar avisos e alarmes ao usuário.

Por exemplo, se a temperatura subir mais de 30 ° C, eu abro um QMessageBox com o tempo de solicitação (o aplicativo faz polling na máquina remota) e a temperatura atual. Portanto, isso é atualizado a cada ciclo de solicitação.

Eu uso o método show () para abrir a caixa de mensagem que mantém meu aplicativo em execução em segundo plano. O problema agora é: o foco está na caixa de mensagem e nada na minha janela principal / QDialog pode ser clicado até que a caixa de mensagem não seja aceita / seja concluída.

E esse é o meu problema: no modo de simulação, quero brincar com diferentes valores de temperatura que posso ajustar por controle deslizante na janela principal. Como posso acessar esses widgets / tornar a caixa de mensagem de alguma forma "não bloqueada"?

Atenciosamente,

Matthias

Foi útil?

Solução

O que você está experimentando é chamado de "modalidade" de uma janela.Por padrão, um QMessageBox é "modal de aplicativo".Isso significa que a entrada para todas as outras janelas do aplicativo é bloqueada.

Para alterar a modalidade, use setWindowModality () com um valorde Qt :: WindowModality antes de chamar show().No seu caso:

box->setWindowModality(Qt::NonModal);
box->show();

Outras dicas

Na verdade, você tem uma caixa de mensagem modal que é a forma como o QMessageBox deve funcionar - ou seja, o usuário deve ser alertado e a interface do usuário está protegida de futuras interações até que o usuário registre a mensagem, feche a caixa de mensagem e (se necessário) tomou qualquer ação necessária em resposta à mensagem.

Agora, se você definir a modalidade da caixa de mensagem como Qt :: NonModal, (lembre-se de atribuí-la a uma variável que não sairá do escopo quando seu aplicativo continuar após abrir a caixa de mensagem), você será capaz de interagir com a interface do usuário, mesmo enquanto a caixa de mensagem é exibida., o que devo dizer que é "incomum". Se eu entender seu requisito, você já terá a caixa de mensagem aberta - então, enquanto ela ainda estiver ativa, você vai querer brincar com diferentes valores de temperatura na janela principal - com que efeito? Até que outra caixa de diálogo de mensagem seja produzida? A caixa de mensagem terá que ser descartada em algum momento.

Não apenas isso, mas se você mostrar uma caixa de mensagem não modal e interagir com a janela principal, é bem provável que a caixa de mensagem desapareça atrás da janela principal, fora de vista de qualquer maneira.

Sugiro que as caixas de mensagem sejam geralmente tratadas como pretendido - apenas caixas de alerta modais temporárias e temporárias e que talvez você precise de um relatório / área de status ao vivo claramente visível em sua janela principal em vez de utilizar um QMessageBox não modal.

Espero que isso ajude

Atenciosamente

Roger

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top