2013-12-22 3 views
4

Я столкнулся с странным угловым футляром при попытке визуализировать полностью прозрачный виджет в PySide.Полностью прозрачная маска -> полностью непрозрачный виджет

Если я звоню setMask с QBitmap, который заполнен Qt.color0, это делает виджет полностью непрозрачным (а не полностью прозрачным, как и следовало ожидать).

Ввод одного пикселя Qt.color приводит к ожидаемому поведению: виджет становится полностью прозрачным, кроме этого одиночного пикселя.

Ниже приведен минимальный пример. Изменение переменной single_pixel на True заполняет верхний левый пиксель, что заставляет маску начать работать как ожидалось.

Любые идеи, что здесь происходит?

import sys 
from PySide import QtCore, QtGui 

app = QtGui.QApplication(sys.argv) 

widget = QtGui.QWidget() 
widget.resize(200, 200) 
widget.show() 

bitmap = QtGui.QBitmap(widget.size()) 
bitmap.clear() 

single_pixel = False 
if single_pixel: 
    painter = QtGui.QPainter() 
    painter.begin(bitmap) 
    painter.setPen(QtCore.Qt.color1) 
    painter.drawPoint(0,0) 
    painter.end() 

widget.setMask(bitmap) 

sys.exit(app.exec_()) 

ответ

3

QWidget::setMask(QBitmap) преобразует QBitmap в QRegion и вызывает QWidget::setMask(QRegion). QRegion, созданный пустым растровым изображением, пуст. Поэтому использование пустой растровой карты в setMask равно widget.setMask(QRegion()). Qt предполагает, что предоставление пустой области означает отбрасывание маски. Это разумно, потому что нет другого флага действительности в QRegion, кроме isEmpty. QWidget::mask возвращает пустую область, когда маска не установлена ​​в соответствии с документацией, поэтому пустой QRegion, по-видимому, рассматривается как особое значение, означающее, что маска не установлена.

В QWidget::setMask(QRegion):

d->extra->mask = newMask; 
d->extra->hasMask = !newMask.isEmpty(); 

Это, вероятно, ошибка в Qt документации. QWidget::setMask Документы должны содержать примечание об этом.

Смежные вопросы