pyqt - Qt: Borrar el fondo(Windows Aero Glass)
windows-vista dwm (2)
He estado buscando en Google por un tiempo, así que pensé en compartir la solución:
reemplace WA_NoSystemBackground por WA_TranslucentBackground y olvídese del mousepressevent
ahora la ventana es Aero Glass transparente y re-renderizada automáticamente cuando sea necesario, yay :)
Actualizar
vea Usar Blur Behind en Windows para ver un ejemplo del uso de Qt y DWM . texto alternativo http://labs.trolltech.com/blogs/wp-content/uploads/2009/09/blurbehind2.png
Pregunta original:
Quiero crear una ventana Windows Aero Glass con Qt, ahora se ve así:
Pero después de llamar a algunos my_window->repaint()
la etiqueta de mi ventana se rompe:
Pero ahora si cambio el tamaño de la ventana ligeramente, se vuelve a pintar correctamente.
La pregunta es : ¿cómo borro el fondo de la ventana para que los widgets se pinten sobre un cristal limpio?
El código corto para reproducir el problema es (Vista con 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()
Puede hacer clic en la ventana ahora, o simplemente presionar Alt-Tab
varias veces.
De todos modos, usar etiquetas con Aero Glass no es lo que necesito, porque QLabel no sabe cómo pintarse a sí mismo con un resplandor (como el título de la ventana). Lo que necesito es una forma general de limpiar el "cristal".
Solo usa:
QPainter p
p.setCompositionMode(QPainter::CompositionMode_DestinationIn);
p.fillRect(boundsRect, QColor(0, 0, 0, 0));
Esto descarta los contenidos antiguos y se llena con un color transparente.
Más información en
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
Edición: mejor use CompositionMode_Clear y pinte el rect con cualquier color.