2016-01-11 2 views
3

Je dois dessiner une fenêtre transparente (soit ou QFrame ou QWidget), mais sans utiliser WA_TranslucentBackground. La raison en est que les fenêtres contiendront d'autres widgets enfants rendus via OpenGL, et en utilisant cette propriété rend ces fenêtres invisibles sur Windows, comme documenté here. Cela fonctionne très bien dans Mac cependant, j'ai besoin d'une solution différente sur Windows seulement, car cela ne fonctionne pas là. J'ai essayé ceci: mise en blanc pixmap. Mais il apparaît toujours avec un fond gris:Qt - Dessiner une fenêtre entièrement transparente dans Windows sans utiliser WA_TranslucentBackground

#include <QApplication> 
#include <QLabel> 
#include <QBitmap> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    QLabel l; 
    l.setWindowFlags(Qt::FramelessWindowHint); 
    QPixmap p(""); 
    l.setPixmap(p); 
    l.setScaledContents(true); 
    l.resize(300, 500); //just to test my idea 
    l.setMask(p.scaled(l.width(),l.height(),Qt::IgnoreAspectRatio, 
    Qt::SmoothTransformation).mask()); 
    l.show(); 
    return a.exec(); 
} 

Quelqu'un peut-il suggérer tout autre moyen d'y parvenir sous Windows, i.e. une fenêtre totalement transparente? Plate-forme - Qt 5.3.1, 32 bits. P.S - Il n'a pas besoin de se comporter comme une fenêtre translucide, c'est-à-dire que l'arrière-plan peut être cliqué à travers les parties transparentes d'un widget rendu par WA_TranslucentBackground. Ici, tant qu'il est transparent, ça ira, il ne doit pas être cliquable.

+0

Peut-être utiliser SetWindowRgn pour que la région de la fenêtre parent se compose des rectangles de la fenêtre enfant créant ainsi l'illusion d'un parent invisible. – Jonathan

+0

Pouvez-vous ajouter un exemple de travail minimal comme réponse? – SexyBeast

+0

Je ne suis actuellement pas proche d'un environnement de compilation approprié. Mais voici un lien vers une page codeproject qui utilise SetWindowRgn pour créer des trous dans une fenêtre. http://www.codeproject.com/Articles/291/Creating-holes-in-a-window – Jonathan

Répondre

1

Malheureusement, cela n'est pas possible sous Windows. Vous pouvez définir la transparence pour le widget avec la couleur avec le canal alpha comme ceci: setStyleSheet("background-color: rgba(255,0,0,50%);");. Mais le whis ne fonctionne pas pour le widget de niveau supérieur jusqu'à ce que vous définissiez WA_TranslucentBackground. Sans ce drapeau, le canal alpha ne fonctionne pas et vous obtenez une fenêtre noire. Donc, la seule solution est l'utilisation WA_TranslucentBackground. Et puis faire de la peinture OpenGL, comme la documentation Qt dit:

Pour contourner ce problème, vous pouvez simplement utiliser Qt pour rendre tout et non OpenGL, ou vous pouvez rendre l'OpenGL dans un pixmap et d'en tirer que sur votre widget à la place.

0

Je suis sous Windows (Qt 5) et utiliser les éléments suivants pour créer un widget semi-transparent:

setWindowOpacity(0.6); 
setStyleSheet("QWidget{background: #000000}") 

Il devrait fonctionner si vous réglez l'opacité à zéro. Je l'utilise avec les drapeaux Windows "framelessWindow" et "Tool" pour assombrir l'arrière-plan de l'écran.

+0

Si je mets l'opacité à zéro, tous les widgets enfants ne deviendront-ils pas invisibles? – SexyBeast

+0

Désolé, je ne sais pas car je n'ai aucun enfant Widgets dans ma configuration et il n'est pas explicitement indiqué dans la documentation. – Mailerdaimon

+0

Cela ne fonctionne toujours pas. L'arrière-plan est gris comme avant. – SexyBeast