2012-02-05 7 views
5

Desidero implementare una finestra di notifica sottoclasse QDialog. Dovrebbe essere in cima ad altre finestre, ma non voglio che rubi lo stato attivo da altre finestre per ovvi motivi. Sono anche preoccupato che interferirebbe con applicazioni a schermo intero come video e giochi.Implementazione di finestre di dialogo di notifica che non rubano lo stato attivo dalle app a schermo intero?

Come faccio a implementare questo? Ci sono delle pratiche comuni di programmazione e UX che potrei voler sapere?

risposta

0

Prima di tutto è necessario creare un non modal dialog:

una finestra di dialogo non modale è una finestra di dialogo che opera indipendentemente da altri finestre della stessa applicazione. Le finestre di dialogo Trova e sostituisci nei processori di testi sono spesso non modali per consentire all'utente di interagire con sia nella finestra principale dell'applicazione sia nella finestra di dialogo.

Per achive che è necessario chiamare la funzione show e non il exec uno.

+0

Correggetemi se sbaglio, ma questo fa sì che la finestra operi indipendentemente dal suo genitore. Ancora non rimarrà in cima quando l'utente ALT + TAB. – Pieter

+0

Un QDialog è una finestra di livello superiore. Puoi usare la funzione 'raise' se vuoi assicurarti che sia in cima allo stack del widget genitore. Usando 'mostra', la finestra di dialogo sarà visibile e sarai in grado di interagire con le altre finestre dell'applicazione. Se si desidera rendere visibile la finestra di dialogo in tutta l'applicazione, è possibile impostare la finestra principale come principale. Non sono sicuro di cosa succede con i TAB di ALT + – pnezis

+0

Quando l'utente preme ALT + TAB (o concentra l'attenzione su una finestra a schermo intero), QDialog non è più in cima ad altre finestre. Questo non è il comportamento desiderato per una notifica [MSN Messenger-like] (http://www.donkhuth.com/wp-content/uploads/2007/01/saosang.jpg) come quella che sto cercando di ottenere. – Pieter

1

non l'ho provato, ma sembra che

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

dovrebbe funzionare, in concomitanza con lo rende non modale.

+0

Ho rimosso l'indicatore di risposta corretto dal tuo post perché a volte il popup ruba l'attenzione dalla mia finestra corrente. Questo non è un comportamento desiderato.Come posso evitare questo? – Pieter

0

Sembra piuttosto un vecchio argomento. Tuttavia, non ho visto nessuno pubblicare una risposta adeguata che funzioni, quindi sto postando la mia soluzione allo stesso problema che ho dovuto affrontare di recente.

Prima di tutto, se si desidera che la finestra di dialogo non rubi lo stato attivo da altre finestre di dialogo o campi di input, è necessario impostare la seguente proprietà: Qt :: WA_ShowWithoutActivating. Usando questa proprietà, la finestra (finestra di dialogo è anche una finestra) verrà mostrata senza essere attivata. Quindi, probabilmente vorrai personalizzare la finestra di dialogo in base alle tue esigenze e vorrai che questa finestra di dialogo sia mostrata sopra. Pertanto, è possibile impostare i seguenti flag Finestra per ottenere tale risultato in modo multipiattaforma: Qt :: FramelessWindowHint | Qt :: NoDropShadowWindowHint | Qt :: X11BypassWindowManagerHint | Qt :: Tool | Qt :: WindowStaysOnTopHint | Qt :: WindowTransparentForInput | Qt :: WindowDoesNotAcceptFocus.

Il seguente codice è uno degli esempi di realizzare una finestra che è modale, e non ruba fuoco da chiunque (supponendo finestra è una variabile che punta alla un'istanza valida di 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); 
Problemi correlati