尝试在 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_())
最佳答案
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
docs 应该包含有关此的注释。