2017-10-12 3 views
-1

Je construis une interface utilisateur dans Qt 5.9 qui doit fonctionner sur un écran X11. J'essaie d'ajouter des ombres portées à mes fenêtres de dialogue - mais elles ne fonctionnent pas sur X11.Comment créer un Qt Drop Shadow sans utiliser de transparents? (Parce que le gestionnaire de fenêtres ne le supporte pas)

L'approche que je prends est de la réponse de zeFree dans This Question. (Mettez tout dans la fenêtre dans un widget, définissez la fenêtre translucide, et créer un effet dropshadow sur le widget).

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

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

Il fonctionne très bien dans ma RedHat vm:

RedHat Dropshadow

Mais quand j'envoie à l'affichage X11 I, il semble que la transparence est pas pris en charge, et je reçois l'ombre sur noir à la place:

X11 Dropshadow

ma question est: y at-il un moyen de faire mes Dialogs projeter une ombre sur mon fenêtre principale au lieu de leur propre arrière-plan (transparent)? Mon application sera en plein écran sur l'écran X11, donc je n'ai pas besoin de m'inquiéter des effets d'ombre en dehors de la fenêtre.

Toute réponse qui me donne un moyen propre d'obtenir un effet d'ombre portée sur cet écran X11 sera acceptée.

Répondre

0

Si votre fenêtre de gestion ne prend pas en charge la transparence, vous n'avez pas de chance IMO. Au moins avec votre approche actuelle. En théorie, il existe un moyen de truquer, à condition que vous puissiez saisir les valeurs de pixels du gestionnaire de fenêtres sous-jacent qui est sous votre application, puis dessiner ces pixels de votre application, en remplissant le vide noir, avec l'ombre composée sur cela, et enfin vos affaires GUI.

Il y a aussi le moyen le plus viable d'abandonner les boîtes de dialogue fenêtrées natives et de truquer la boîte de dialogue en utilisant un widget flottant régulier. Cela a l'inconvénient de ne pouvoir se déplacer que dans les limites de votre fenêtre principale, mais vous aurez ainsi un contrôle total sur le dessin et ne serez pas victime des limitations de la plate-forme.

+0

Merci pour l'entrée. Avez-vous des références ou des exemples pour les approches qui n'utilisent pas de transparents? Je considérais la possibilité de créer un widget sur ma fenêtre principale sous le dialogue. Ensuite, je devrais le cacher quand la boîte de dialogue disparaît. Je pense que pour cette application, je peux éviter le besoin de déplacer le dialogue - ce qui pourrait simplifier le scénario. – spickesj

+0

Je ne sais pas, mais son linux, il y aura probablement un moyen de copier les pixels du framebuffer x. Faites un peu de recherche. – dtech