【发布时间】:2010-10-01 23:17:40
【问题描述】:
更新
请参阅Using Blur Behind on Windows 了解使用 Qt 的示例和DWM.alt text http://labs.trolltech.com/blogs/wp-content/uploads/2009/09/blurbehind2.png
原问题:
我想用 Qt 创建一个 Windows Aero Glass 窗口,现在它看起来像这样:
但是在调用了一些 my_window->repaint() 之后,我的窗口标签就坏了:
但是现在如果我稍微调整窗口大小,它会正确地重新绘制。
问题是:如何擦除窗口背景,以便小部件可以将自己涂在干净的玻璃上?
重现问题的简短代码是(Vista with 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()
您现在可以点击窗口,或者直接点击Alt-Tab 几次。
无论如何,使用带有 Aero Glass 的标签不是我需要的,因为 QLabel 不知道如何用发光(如窗口的标题)来绘制自己。我需要的是一种清洁“玻璃”的通用方法。
【问题讨论】:
-
为什么要调用重绘?窗口管理器不能自己处理控件绘制吗?
-
其实你不应该重绘——只要使用 Alt-Tab 几次,窗口就会被重绘。
标签: pyqt windows-vista dwm aero-glass