2017-10-12 5 views
-1

Ich baue eine Benutzeroberfläche in Qt 5.9, die auf einem X11-Display ausgeführt werden muss. Ich versuche, Schlagschatten zu meinen Dialogfenstern hinzuzufügen - aber sie funktionieren nicht über X11.Wie erstelle ich einen Qt Drop Shadow ohne Verwendung von Transparenzen? (Weil der Fenstermanager dies nicht unterstützt)

Der Ansatz, den ich nehme, stammt aus der Antwort von zeFree in This Question. (Setzen Sie alles in das Fenster in einem Widget, setzen Sie das Fenster durchsichtig und erstellen Sie einen Dropshadow-Effekt für das Widget).

setAttribute(Qt::WA_TranslucentBackground); //enable Window to be transparent 

QGraphicsDropShadowEffect* effect = new QGraphicsDropShadowEffect(); 
effect->setBlurRadius(5); 
ui->widget->setGraphicsEffect(effect); 

Es ist großartig in meinem RedHat vm funktioniert:

RedHat Dropshadow

Aber wenn ich an die X11-Display sende mich, es sieht aus wie die Transparenz nicht unterstützt wird, und ich erhalte den Schatten auf statt schwarz:

X11 Dropshadow

Meine Frage ist: gibt es eine Möglichkeit, meine Dialoge projizieren einen Schlagschatten machen auf meine Hauptfenster statt auf ihren eigenen (transparenten) Hintergrund? Meine Anwendung wird im Vollbildmodus auf dem X11-Display angezeigt, sodass ich mich nicht um Schatteneffekte außerhalb des Fensters kümmern muss.

Jede Antwort, die mir einen sauberen Schattenwurf auf diesem X11-Display gibt, wird akzeptiert.

Antwort

0

Wenn Ihr Fenster verwalten Transparenz nicht unterstützt, haben Sie Pech IMO. Zumindest mit Ihrem derzeitigen Ansatz.

Es gibt theoretisch eine Möglichkeit, es zu fälschen, vorausgesetzt, Sie können die Pixelwerte aus dem zugrunde liegenden Fenstermanager-Composite unter Ihrer Anwendung abrufen und diese Pixel aus Ihrer Anwendung herausziehen, indem Sie die schwarze Lücke füllen das und schließlich dein GUI-Zeug.

Es gibt auch den praktikableren Weg, auf native Fensterdialoge zu verzichten und den Dialog mit einem regulären Floating-Widget zu fälschen. Dies hat den Nachteil, dass es sich nur innerhalb der Grenzen Ihres Hauptfensters bewegen kann, aber auf diese Weise haben Sie die volle Kontrolle über die Zeichnung und werden nicht den Einschränkungen der Plattform ausgesetzt.

+0

Danke für die Eingabe. Haben Sie Referenzen oder Beispiele für die Ansätze, die keine Transparenzen verwenden? Ich erwog die Möglichkeit, ein Widget in meinem Hauptfenster unter dem Dialog zu erstellen. Dann müsste ich es verstecken, wenn der Dialog verschwindet. Ich denke, für diese Anwendung kann ich die Notwendigkeit vermeiden, den Dialog zu verschieben - so könnte das Szenario vereinfacht werden. – spickesj

+0

Ich nicht, aber seine Linux, wird es wahrscheinlich eine Möglichkeit sein, Pixel aus dem x Framebuffer zu kopieren. Suche ein wenig. – dtech

Verwandte Themen