QMessageBox bloqueia QDialog
-
28-10-2019 - |
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
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