在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值也导致解决我在这个特殊情况下遇到的更大问题 - 创建不同的灰度,在我发布的解决方案中详细说明,这实际上并不是我问的问题的解决方案。无论如何,谢谢!
答案 0 :(得分:1)
我认为通过变换无法达到目标:填充模式在“场景”空间中生成,然后基于视图比例因子对其应用变换,显然这将增加点之间的间距,无需转换可以防止,只有不同的图案绘制。
为了达到你想要的效果,画笔必须有一个参数来控制场景坐标中各点之间的距离;然后在rect的paint()方法中,您可以根据当前视图缩放系数(通过paint()方法的style参数)设置此参数值。
由于我不认为QBrush提供这样的参数,你必须自己绘制点,使用前面段落中描述的计算距离。从Python中完成,如果有点数洛杉矶,这可能会非常慢,但是再次PyQt5的表现一般都非常令人印象深刻。
并不是说您必须为点选择原点(角落或中心将是典型的选择),并且当您放大时,您将看到点“滑动”朝向原点,因为更多点被“添加” “到相反的两端/边缘。我认为很有可能你不喜欢这种效果,因为实现起来并不那么容易,你可能想要考虑一种不基于点的不同视觉效果,比如渐变或alpha值。可能还有其他方法,比如setDashPattern()或在视图坐标中绘制一个休息,但可能不值得努力。
答案 1 :(得分:1)
感谢Schollii领导:设置alpha值提供了快速解决方案。我选择黑色,使用不同的alpha值来表示各种灰度。
如果你有不同的项目以不同的方式加阴影,你可以浏览项目列表:
myItem.setBrush(QBrush(QColor(0,0,0,35*n)))
根据看起来不错的东西选择35,这样您就可以从一个项目到下一个项目获得所需的灰度级别。
这比次类化和转换大大减少了错综复杂!