Qt:擦除背景(Windows Aero Glass)

20

更新

查看在Windows上使用模糊背景,了解使用Qt和DWM的示例。alt文本 http://labs.trolltech.com/blogs/wp-content/uploads/2009/09/blurbehind2.png


原问题:

我想要用Qt创建一个Windows Aero Glass窗口,现在它看起来像这样:alt text

但是在调用了一些my_window->repaint()之后,我的窗口标签就会变得不正常: alt text

但现在如果我略微调整窗口的大小,它就会正确地重新绘制。


问题是:如何擦除窗口背景,以便小部件可以在干净的玻璃上绘制自己?


复现该问题的简短代码是(在具有Aero的Vista上):

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()

现在您可以点击窗口,或者只需按下Alt-Tab几次。

无论如何,在Aero Glass中使用标签不是我所需要的,因为QLabel不知道如何使用白色发光来绘制自己(如窗口标题)。我需要的是一种通用的方法来清除“玻璃”。


为什么要调用repaint?窗口管理器不能自己处理控件绘制吗? - Soviut
1
实际上你不应该重绘 - 只需使用Alt-Tab几次,窗口就会重新绘制。 - Andrew T
2个回答

6

1
我已经谷歌了一段时间,所以我想分享解决方案:
将WA_NoSystemBackground替换为WA_TranslucentBackground,然后忘记mousepressevent
现在窗口是透明的Aero玻璃,并在需要时自动重新渲染,耶 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接