Подтвердить что ты не робот

Qt: стереть фон (Windows Aero Glass)

Update

см. Использование Blur Behind в Windows для примера использования Qt и DWM. alt text http://labs.trolltech.com/blogs/wp-content/uploads/2009/09/blurbehind2.png


Оригинальный вопрос:

Я хочу создать окно Windows Aero Glass с Qt, теперь оно выглядит так: alt text

Но после вызова некоторого my_window->repaint() моя метка окна будет нарушена: alt text

Но теперь , если я немного изменил размер окна, он будет правильно перерисовываться.


Вопрос: как стереть фон окна, чтобы виджеты рисовали себя на чистом стекле?


Короткий код для воспроизведения проблемы (Vista с 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 не знает, как рисовать себя с помощью свечения (например, название окна). Мне нужен общий способ очистки "стекла".

4b9b3361

Ответ 1

Просто используйте:

QPainter p

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

Это отбрасывает старое содержимое и заполняется прозрачным цветом.

Дополнительная информация на

Изменить: Лучше использовать CompositionMode_Clear и рисовать прямоугольник любым цветом.

Ответ 2

Я искал время для поиска, поэтому решил, что смогу поделиться решением:

заменить WA_NoSystemBackground на WA_TranslucentBackground и забыть о mousepressevent

теперь окно является прозрачным аэрозоном и автоматически перерисовывается автоматически, yay:)