Qt: Effacer l'arrière-plan (Vitres Aero Glass))

mise à Jour

voir l'Utilisation du Flou Derrière sur Windows pour un exemple d'utilisation de Qt et DWM. texte alternatif http://labs.trolltech.com/blogs/wp-content/uploads/2009/09/blurbehind2.png


question originale:

je veux créer une fenêtre de verre Windows Aero avec Qt, maintenant il ressemble à ceci: alt text

mais après en avoir appelé quelques-uns my_window->repaint() l'étiquette de ma fenêtre devient cassé: alt text

Mais maintenant si je redimensionne la fenêtre légèrement, il repeint correctement.


la question Est: Comment puis-je effacer le fond de la fenêtre, pour que les widgets se peignent eux-mêmes sur un verre propre?


Le code court pour reproduire le problème (Vista avec Aero):

class Window(QWidget):
    def __init__(self, *args):
        QWidget.__init__(self, *args)
        self.setLayout(QVBoxLayout())
        self.layout().addWidget(QLabel("This is the text"))

        # let the whole window be a glass
        self.setAttribute(Qt.WA_NoSystemBackground)
        from ctypes import windll, c_int, byref
        windll.dwmapi.DwmExtendFrameIntoClientArea(c_int(self.winId()), byref(c_int(-1)))
    def mousePressEvent(self, event):
        self.repaint()

Vous pouvez cliquer sur la fenêtre maintenant, ou appuyez simplement Alt-Tab plusieurs temps.

de toute façon, utiliser des étiquettes en verre aéré n'est pas ce dont j'ai besoin, car QLabel ne sait pas comment se peindre avec un peu de lueur (comme le titre de la fenêtre). J'ai besoin d'un moyen général pour nettoyer le "verre".

20
demandé sur Community 2009-01-17 12:36:53

2 réponses

utilisation:

QPainter p

p.setCompositionMode(QPainter::CompositionMode_DestinationIn);
p.fillRect(boundsRect, QColor(0, 0, 0, 0));

cela écarte l'ancien contenu et remplit de couleur transparente.

Plus d'info

Modifier: Une meilleure utilisation Compostionmode_clear et peindre le rect avec n'importe quelle couleur.

6
répondu Viesturs 2015-04-20 08:41:53

j'ai cherché sur Google pendant un certain temps donc j'ai pensé que je partagerais la solution:

remplacer WA_NoSystemBackground par WA_TranslucentBackground et oublier le mousepressevent

maintenant la fenêtre est transparente aero glass et re-rendu automatiquement si nécessaire, yay:)

1
répondu ben 2011-08-16 10:55:43