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