2012-02-05 11 views
5

Quiero implementar una ventana de notificación mediante la subclasificación QDialog. Debería estar encima de otras ventanas, pero no quiero que robe el foco de otras ventanas por razones obvias. También me preocupa que pueda interferir con aplicaciones de pantalla completa, como videos y juegos.Implementando diálogos de notificación que no roban el foco de las aplicaciones de pantalla completa?

¿Cómo hago para implementar esto? ¿Hay alguna programación común y prácticas de UX que me interese conocer?

Respuesta

0

En primer lugar usted necesita para crear un non modal dialog:

un cuadro de diálogo modal es un diálogo que funciona independientemente de otros ventanas en la misma aplicación. Buscar y reemplazar diálogos en Los procesadores de texto a menudo no son modestos para permitir al usuario interactuar con tanto en la ventana principal de la aplicación como con el cuadro de diálogo.

Para achive que tiene que llamar a la función show y no exec uno.

+0

Corrígeme si me equivoco, pero esto solo hace que la ventana funcione independientemente de su padre. Todavía no se mantendrá en la parte superior cuando el usuario ALT + TAB. – Pieter

+0

Un QDialog es una ventana de nivel superior. Puede usar la función 'raise' si quiere asegurarse de que estará encima de la pila del widget padre. Usando 'show', el diálogo estará visible y podrá interactuar con las otras ventanas de la aplicación. Si desea que el diálogo sea visible en toda la aplicación, puede configurar la ventana principal como principal. No estoy seguro de qué sucede con las ALT + TABs – pnezis

+0

Cuando el usuario presiona ALT + TAB (o le da enfoque a una ventana de pantalla completa), QDialog ya no se encuentra en la parte superior de otras ventanas. Este no es el comportamiento deseado para una notificación [similar a MSN Messenger] (http://www.donkhuth.com/wp-content/uploads/2007/01/saosang.jpg) como la que intento lograr. – Pieter

1

no lo he probado, pero parece que

my_dialog->setWindowFlags(Qt::CustomizeWindowFlags | ... | Qt::WindowStaysOnTopHint); 

debería funcionar, en conjunción con lo que es no modal.

+0

He eliminado el marcador de respuesta correcta de tu publicación porque a veces la ventana emergente roba el foco de mi ventana actual. Este no es un comportamiento deseado.¿Cómo puedo evitar esto? – Pieter

0

Parece un tema bastante viejo. Sin embargo, no vi a nadie publicar una respuesta adecuada que simplemente funciona, por lo que estoy publicando mi solución al mismo problema al que me he enfrentado recientemente.

En primer lugar, si usted quiere que su diálogo no robar el foco de otros cuadros de diálogo o campos de entrada, se debe establecer la siguiente propiedad: Qt :: WA_ShowWithoutActivating. Usando esta propiedad, la ventana (el diálogo también es una ventana) se mostrará sin estar activado. Entonces, probablemente querrás personalizar tu diálogo según tus necesidades, y querrás que este diálogo se muestre en la parte superior. Por lo tanto, se pueden establecer los siguientes indicadores de Ventana para lograr dicho resultado de forma multiplataforma: Qt :: FramelessWindowHint | Qt :: NoDropShadowWindowHint | Qt :: X11BypassWindowManagerHint | Qt :: Herramienta | Qt :: WindowStaysOnTopHint | Qt :: WindowTransparentForInput | Qt :: WindowDoesNotAcceptFocus.

El código siguiente es uno de los ejemplos para lograr un diálogo que es modal, y no se roba el foco de cualquier persona (suponiendo de diálogo es una variable apuntando a la instancia válida de QDialog):

dialog->setAttribute(Qt::WA_ShowWithoutActivating, true); 
dialog->setWindowFlags(dialog.windowFlags() | Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint | Qt::X11BypassWindowManagerHint | Qt::Tool | Qt::WindowStaysOnTopHint | Qt::WindowTransparentForInput | Qt::WindowDoesNotAcceptFocus); 
Cuestiones relacionadas