Pregunta

Realmente no sé cómo formular mi pregunta esta vez...

Tengo mi aplicación con QDialog como ventana principal.La aplicación obtiene diferentes valores como temperatura, humedad, etc. desde una máquina remota.

Para el desarrollo agregué un cuadro de grupo con diferentes widgets para simular estos valores.Tengo diferentes límites para lanzar avisos y alarmas al usuario.

Por ejemplo, si la temperatura aumenta más de 30 °C, abro un QMessageBox con la hora de solicitud (la aplicación realiza un sondeo en la máquina remota) y la temperatura actual.Entonces esto se actualiza en cada ciclo de solicitud.

Utilizo el método show() para abrir el cuadro de mensaje que mantiene mi aplicación ejecutándose en segundo plano.El problema ahora es:el foco está en el cuadro de mensaje y no se puede hacer clic en nada en mi ventana principal/QDialog hasta que el cuadro de mensaje no sea aceptado/ha terminado.

Y ese es mi problema:en el modo de simulación quiero jugar con diferentes valores de temperatura que puedo ajustar mediante el control deslizante en la ventana principal.¿Cómo puedo acceder a estos widgets/hacer que el cuadro de mensaje de alguna manera "no bloquee"?

Atentamente,

Matías

¿Fue útil?

Solución

Lo que estás experimentando se llama "modalidad" de una ventana.Por defecto, un QMessageBox es "modal de aplicación".Esto significa que se bloquea la entrada a todas las demás ventanas de la aplicación.

Para cambiar la modalidad, utilice establecerModalidadVentana() con un valor de Qt::Modalidad de ventana justo antes de llamar show().En tu caso:

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

Otros consejos

De hecho, tiene un cuadro de mensaje modal que es la forma en que QMessageBox debe funcionar, es decir, se debe alertar al usuario y la interfaz de usuario está protegida contra interacciones posteriores hasta que el usuario haya registrado el mensaje, cerrado el cuadro de mensaje y (si necesario) ha realizado cualquier acción necesaria en respuesta al mensaje.

Ahora, si configura la modalidad del cuadro de mensaje en Qt :: NonModal, (recuerde asignarlo a una variable que no saldrá del alcance cuando su aplicación continúe después de que aparezca el cuadro de mensaje) podrá interactuar con la interfaz de usuario incluso mientras se muestra el cuadro de mensaje., que tengo que decir que es "inusual". Si entiendo su requisito, ya tendrá el cuadro de mensaje abierto; entonces, mientras aún esté activo, querrá jugar con diferentes valores de temperatura en la ventana principal, ¿con qué efecto? ¿Hasta que se genere otro cuadro de diálogo de mensaje? El cuadro de mensaje tendrá que descartarse en algún momento.

No solo eso, sino que si muestra un cuadro de mensaje no modal y luego interactúa con la ventana principal, es muy probable que el cuadro de mensaje desaparezca detrás de la ventana principal, de todos modos fuera de la vista.

Sugeriría que los cuadros de mensaje se traten generalmente como se pretende: solo cuadros de alerta modal transitorios y temporales y que tal vez necesite un área de estado / informe en vivo claramente visible en su ventana principal en lugar de utilizar un QMessageBox no modal.

Espero que esto ayude

Saludos

Roger

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top