2013-12-22 44 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文檔應包含有關此的說明。