QBrush - 缩放标准填充点画图案?

QBrush - scale a standard fill stipple pattern?

在 PyQt 中,我有一个 QGraphicsScene,我向其中添加了一个具有标准 QBrush 填充图案之一的矩形,在本例中为 Qt.Dense7Pattern。当场景以原始 1:1 比例显示时,这会按预期显示:构成 Dense7Pattern 的 "dots" 彼此相距一定数量的像素,假设相距 5 个像素只是为了选择一个数字.另外,假设原始矩形的宽度为 50 像素,高度为 50 像素。

当我放大那个场景时,比方说放大 2 倍,使填充的矩形现在显示为 100x100 像素,我希望填充图案的点仍然相隔 5 个像素,但是,Qt 缩放也在静态填充图案上,使填充图案的点相隔 10 个像素。

This question 看起来很相似。显然,您可以将变换(包括缩放)应用于画笔的像素图填充图案,但是,它似乎不适用于画笔的 'standard' 填充图案。我做了子类并在 paint 方法中更改了画笔的变换,但没有成功:

整个子类(希望我做了所有必要的事情):

class customFillPolygonItem(QGraphicsPolygonItem):
    def paint(self,painter,option,widget=None):
        # from here, painter.setBrush affects shapes drawn directly in this function;
        #  self.setBrush affects the call to super().paint
        newBrush=QBrush(painter.brush())
        newBrush.setTransform(QTransform(painter.worldTransform().inverted()[0]))
        self.setBrush(newBrush)
        painter.setBrush(newBrush)
        painter.drawRect(QRectF(0,0,50,50)) # draw a reality-check object
        super(customFillPolygonItem,self).paint(painter,option,widget)

然后我使用

从上面创建一个实例
myItem=customFillPolygonItem(QPolygonF(...
myItem.setBrush(QBrush(Qt.Dense7Pattern))
myScene.addItem(myItem)

所以 - 是否可以将比例应用于画笔的标准填充图案?这类似于 QBrush.setFlag(ItemIgnoresTransformations) 但这样的事情不存在......你只能在整个项目(在这种情况下为矩形)上设置该标志。

解决方法可能包括: - 使用 ItemIgnoresTransformations 并根据需要手动转换实际的矩形顶点 - 用每个标准填充图案制作一个 qpixmap,然后使用该 pixmap 作为画笔,在这种情况下它应该像上面提到的问题那样缩放

当然,如果能找到最简单的解决方案就更好了。

更新: Schollii 回答了被问到的问题;他查看 alpha 值的建议也导致解决了我在这个特殊情况下遇到的更大问题 - 创建不同的灰度,在我发布的解决方案中详细说明,这实际上不是我提出的问题的解决方案。无论如何,谢谢!

我认为通过变换无法达到目标:填充图案是在 "scene" space 中生成的,然后根据视图比例因子对其应用变换,显然这将增加点之间的间距,没有任何变换可以阻止它,只有不同的图案绘制。

为了达到你想要的效果,画笔必须有一个参数来控制场景坐标中点之间的距离;然后在 rect 的 paint() 方法中,您可以根据当前视图缩放因子设置此参数值(通过 paint() 方法的 style 参数)。

因为我认为 QBrush 没有提供这样的参数,所以你必须自己绘制点,使用上一段中描述的计算距离。从 Python 开始,如果有 Los of dots,这可能会很慢,但是 PyQt5 总体上具有相当令人印象深刻的性能。

并不是说您必须为点选择原点(通常选择角或中心),并且当您放大时,您会看到点 "slide" 朝向原点,因为更多点是 "added" 到相反的 ends/edges。我认为您很可能不喜欢这种效果,并且由于实现起来并不容易,您可能需要考虑一种不基于点的不同视觉效果,例如渐变或 alpha 值。可能还有其他方法,例如 setDashPattern() 或在视图坐标中绘制休息,但可能不值得付出努力。

感谢 Schollii 的领导:设置 alpha 值提供了一个快速的解决方案。我选择了黑色,使用不同的 alpha 值来表示各种灰度。

如果您有 n 个不同的项目都需要不同的阴影,您可以浏览项目列表:

myItem.setBrush(QBrush(QColor(0,0,0,35*n)))

根据外观选择 35,这样您就可以获得从一个项目到下一个项目所需的灰度级分离量。

这比子类化和转换要简单得多!