2014-06-24 12 views
6

Ho un'applicazione a schermo intero basata su Qt. Le applicazioni a schermo intero dovrebbero essere sempre in primo piano perché altrimenti una parte della finestra sarà ostruita. Voglio che la finestra a schermo intero frameless abbia finestre figlio (finestre di dialogo speciali, ..). Queste finestre secondarie dovrebbero essere mostrate nella parte superiore della finestra a schermo intero. Non ha molto senso mostrarli qui sotto.Con Qt sotto Gnome 3, Xfce e Unity una finestra a schermo intero con una finestra secondaria non rimane in primo piano

A breve, autonomo esempio è:

from PySide import QtGui, QtCore 

app = QtGui.QApplication([]) 

window = QtGui.QWidget(f=QtCore.Qt.WindowStaysOnTopHint) 

child_window = QtGui.QWidget(window, f=QtCore.Qt.Window) 
child_window.resize(400, 300) 

layout = QtGui.QVBoxLayout(window) 
exit = QtGui.QPushButton('Exit') 
exit.clicked.connect(app.exit) 
layout.addWidget(exit) 
create = QtGui.QPushButton('Create child window') 
create.clicked.connect(child_window.show) 
layout.addWidget(create) 
layout.addStretch() 

window.showFullScreen() 

app.exec_() 

E 'scritto in Python e testato su Python 3.X + PySide 1.2.2 (Qt 4.8) + Ubuntu 14.04 (unità desktop) o Windows 7. Tuttavia la trasformazione in C++ Qt (o PyQt) dovrebbe essere semplice.

L'osservazione è che su Windows tutto è come descritto all'inizio. Il Qt.WindowsStaysOnTopHint non è necessario, mentre su Ubuntu lo è.

Su Ubuntu Vedo che la finestra principale inizialmente l'intero schermo è in cima a tutto, ma non appena viene creata una finestra di dialogo figlio le solite decorazioni desktop (in alto e barre a sinistra) vengono visualizzati sopra lo schermo intero della finestra principale ostruente parte della vista! Non appena la finestra secondaria è chiusa, la finestra a schermo intero è nuovamente in primo piano.

La domanda ora è se c'è qualcosa che può essere fatto per avere una finestra a schermo intero che è in primo piano più finestre figlio su Ubuntu e con Qt?

Il diverso comportamento tra Windows e Linux non è soddisfacente in quanto il codice specifico del sistema operativo deve essere evitato se possibile.


tardi:

Utilizzando the overview of available desktop environment on Ubuntu Ho installato diversi ambienti e li testati.

KDE, Lubuntu (Lxde?) E Openbox funzionano come previsto (e ugualmente su Windows). La finestra principale rimane in primo piano quando viene visualizzata a schermo intero e le finestre figlio sono visualizzate sopra.

Tuttavia per Gnome-Shell (Gnome 3), Xfce, Unity e Awesome la decorazione del desktop rimane in cima alla finestra a schermo intero delle finestre dei bambini vengono visualizzate anche. Xfce e Unity si comportano esattamente alla pari, Gnome e Awesome hanno anche alcuni piccoli problemi aggiuntivi.

+0

Come si comporta in altre distribuzioni Linux con un Qun non-mucked-about (ad esempio Debian)? Ubuntu ha, almeno in passato, hackerato alcune cose Qt per cercare di portarlo in linea con la loro visione particolare (cioè la barra dei menu globale).Googling alcune combo di "Ubuntu qt bug menubar fullscreen" presenterà numerosi problemi; Non ho idea di quale sia la situazione di Ubuntu al momento, ma ho fatto app a schermo intero su Debian, con dialoghi, e funzionano bene. NB: Ubuntu! = Linux! – timday

+0

In KDE (Kubuntu) funziona come previsto. – doru

+0

@doru Buono a sapersi. Quindi probabilmente ho bisogno di limitare l'ambito da Linux a Ubuntu. – Trilarion

risposta

0

Hai provato cosa che documentation suggests?

Qt :: WindowStaysOnTopHint 0x00040000 informa il sistema finestra che la finestra deve rimanere in cima a tutte le altre finestre. Nota che su alcuni window manager su X11 devi anche passare Qt :: X11BypassWindowManagerHint affinché questo flag funzioni correttamente.

Un'altra cosa per cui vuoi che l'altra finestra diventi un bambino, se sei tu cosa stare sotto un genitore?

+0

Non ho provato 'X11BypassWindowManagerHint' finora a causa degli effetti collaterali negativi come la mancata gestione della messa a fuoco della tastiera, ma ieri l'ho provato e non ha dato l'effetto desiderato (lo schermo intero non funzionava più se ricordo male). – Trilarion

+0

Perché finestra figlio? Beh, è ​​un'app a schermo intero con dialoghi figlio, quindi questo sarebbe il modo naturale. Anche le finestre figlio dovrebbero trovarsi principalmente davanti a finestre padre automaticamente. E le finestre figlio non creano voci aggiuntive nella barra delle applicazioni. Ma l'ho provato con finestre autonome e nulla è cambiato. Domanda aggiornata – Trilarion

+0

'X11BypassWindowManagerHint' passato a una finestra secondaria impedisce di rendere visibili le decorazioni del desktop. Sei riuscito a risolvere/risolvere questo problema? – user362515