Qt: Стереть фон (Windows Aero Glass) - PullRequest
20 голосов
/ 17 января 2009

Обновление

см. Использование 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 не знает, как рисовать себя при помощи свечения (как заголовок окна). Что мне нужно, так это общий способ очистки "стакана".

Ответы [ 2 ]

6 голосов
/ 27 января 2009

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

QPainter p

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

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

Больше информации на

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

1 голос
/ 16 августа 2011

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

заменить WA_NoSystemBackground на WA_TranslucentBackground и забудь про мышиный подарок

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

...