2016-06-23 16 views
1

Ich würde gerne einen Dialog in Qt 4.8 machen, der nicht zum übergeordneten Dialog blockiert, aber im geöffneten Zustand darüber bleibt.Qt non-blocking Overlay-Dialog

Was habe ich versucht, so weit:

Eltern

Der folgende Code macht genau das, was ich auf Gnome wollen, aber auf Windows/Mac der Dialog auf der Rückseite geht, wenn die Hauptfenster gewinnt den Fokus:

QMainWindow* window = new QMainWindow(); 
QDialog* dialog = new QDialog(window); 

window->show(); 
dialog->show(); 

immer oben

Es besteht auch die Möglichkeit, den Dialog immer an der Spitze zu machen, aber ich glaube nicht, dass meine Anwendung so incredibl sein y wichtig für den Benutzer, dass er es immer oben sein will:

dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); 

Modal Dialog

Es besteht auch die Möglichkeit, ein Fenster modalen Dialog zu machen. Dies blockiert jedoch die Benutzerinteraktion mit dem Hauptfenster, während das Dialogfeld geöffnet ist.

dialog->setWindowModality(Qt::WindowModal); 

Dock-Widget

Ein Dock-Widget macht ziemlich genau, was es sein sollte. Aber es dockt auch an und sieht nicht wie ein Dialog aus.

Wonach suche ich?

+0

Sind Sie sicher? Ich habe den Mac noch nicht ausprobiert, aber unter Windows habe ich das immer als Code gemacht und der Dialog bleibt über dem Fenster – Fabio

+0

Ich habe nur eine laufende Anwendung (mit viel zusätzlichem Code mit möglichen Nebeneffekten) unter Windows getestet und momentan kein Windows-System verfügbar. Aber auf Mac läuft das sicher nicht. –

Antwort

1

Ich denke, was Sie suchen, ist modales Werkzeugfenster.

QMainWindow* window = new QMainWindow(); 
QDialog* dialog = new QDialog(window); 

Qt::WindowFlags flags = dialog->windowFlags(); 
dialog->setWindowFlags(flags | Qt::Tool); 

window->show(); 
dialog->show(); 

von QT Dokument Excerptiert, ist diese Bedeutung von Qt :: Flag Tool:

Zeigt an, dass das Widget ein Werkzeugfenster ist. Ein Werkzeugfenster ist oft ein kleines Fenster mit einer kleineren Titelleiste und Dekoration, die normalerweise für die Sammlung von Werkzeugschaltflächen verwendet wird. Wenn ein Elternteil vorhanden ist, wird das Werkzeugfenster immer darüber gehalten. Wenn kein Elternteil vorhanden ist, können Sie auch Qt :: WindowStaysOnTopHint verwenden. Wenn das Fenstersystem dies unterstützt, kann ein Werkzeugfenster mit einem etwas helleren Rahmen verziert werden. Es kann auch mit Qt :: FramelessWindowHint kombiniert werden. Unter OS X entsprechen Werkzeugfenster der Floating-Klasse von Fenstern. Dies bedeutet, dass das Fenster auf einer Ebene über normalen Fenstern lebt; Es ist unmöglich, ein normales Fenster darauf zu legen. Standardmäßig werden Werkzeugfenster ausgeblendet, wenn die Anwendung inaktiv ist. Dies kann durch das Attribut Qt :: WA_MacAlwaysShowToolWindow gesteuert werden.

+0

Danke, wirklich nett. Das Fenster wird jedoch verschwinden, wenn die Anwendung inaktiv ist (wie dokumentiert). Leider tut 'Qt :: WA_MacAlwaysShowToolWindow' dasselbe wie' Qt :: WindowStaysOnTopHint' auf Mac. Du hättest keine Idee, wie du es ändern kannst, wenn es nur auf dieser Anwendung bleibt, wenn es den Fokus verliert? –

+0

Mac hat in der Tat einen Fehler, überprüfen Sie bitte https://bugreports.qt.io/browse/QTBUG-29816 –

+0

Danke nochmal. Scheint mit Qt 5.8 https://bugreports.qt.io/browse/QTBUG-45938 gelöst zu werden –