【问题标题】:Qt: Erase background (Windows Aero Glass)Qt:擦除背景(Windows Aero Glass)
【发布时间】: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


【解决方案1】:

只需使用:

QPainter p

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

这会丢弃旧内容并用透明颜色填充。

更多信息在

编辑: 最好使用 CompositionMode_Clear 并用任何颜色绘制矩形。

【讨论】:

    【解决方案2】:

    我已经在谷歌上搜索了一段时间,所以我想我会分享解决方案:

    将 WA_NoSystemBackground 替换为 WA_TranslucentBackground 忘记鼠标按下事件

    现在窗口是透明的航空玻璃,并在需要时自动重新渲染,耶 :)

    【讨论】:

      猜你喜欢
      • 2015-05-08
      • 2010-12-30
      • 1970-01-01
      • 1970-01-01
      • 2015-11-13
      • 1970-01-01
      • 1970-01-01
      • 2020-09-02
      • 2011-07-09
      相关资源
      最近更新 更多