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:
mais après en avoir appelé quelques-uns my_window->repaint()
l'étiquette de ma fenêtre devient cassé:
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".
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
http://techbase.kde.org/Development/Tutorials/Graphics/Performance#QPixmap::setAlphaChannel.28.29
http://doc.qt.digia.com/qtjambi-4.4/html/com/trolltech/qt/gui/QPainter.CompositionMode.html
Modifier: Une meilleure utilisation Compostionmode_clear et peindre le rect avec n'importe quelle couleur.
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:)