2013-12-22 109 views
4

当我试图在PySide中渲染一个完全透明的小部件时,我遇到了一个奇怪的角落案例。完全透明的面具 - >完全不透明的部件

如果我打电话setMaskQBitmap填充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)转换QBitmapQRegion并调用QWidget::setMask(QRegion)。由空位图产生的QRegion为空。因此使用setMask中的空位图等于widget.setMask(QRegion())。 Qt假设提供空白区域意味着取消掩码。这是合理的,因为QRegionisEmpty之外没有其他有效性标志。 QWidget::mask根据文档设置没有设置遮罩时返回空白区域,因此空白QRegion显然被视为特殊值,这意味着不设置遮罩。

QWidget::setMask(QRegion)

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

这可能是Qt文档中的错误。 QWidget::setMask文档应包含有关此的说明。