【发布时间】:2017-01-08 23:13:12
【问题描述】:
在 PyQt 中,我有一个 QGraphicsScene,我向其中添加了一个带有标准 QBrush 填充模式之一的矩形,在本例中为 Qt.Dense7Pattern。当场景以原始 1:1 比例显示时,这会按预期显示:构成 Dense7Pattern 的“点”彼此相隔一定数量的像素,假设相隔 5 个像素只是为了选择一个数字。另外,假设原始矩形是 50 像素宽和 50 像素高。
当我放大那个场景时,假设放大 2 倍,使填充的矩形现在显示为 100x100 像素,我希望填充图案的点仍然相隔 5 像素,但是,Qt 放大了静态填充图案也是如此,使填充图案的点看起来相隔 10 个像素。
This question 看起来很相似。显然,您可以将变换(包括比例)应用于画笔的像素图填充图案,但是,它似乎不适用于画笔的“标准”填充图案。我做了子类并在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,然后将该像素图用作画笔,在这种情况下,它应该按照上述问题进行缩放
但当然最好能找到最简单的解决方案。
更新: Schollii 回答了所提出的问题;他关于查看 alpha 值的建议也导致了我在这种特殊情况下遇到的更大问题的解决方案 - 创建不同的灰度,在我发布的解决方案中详细说明,这实际上并不是我提出的问题的解决方案。无论如何,谢谢!
【问题讨论】: