尝试在 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_())

最佳答案

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 应该包含有关此的注释。

10-06 08:41