【问题标题】:QBrush - scale a standard fill stipple pattern?QBrush - 缩放标准填充点画图案?
【发布时间】: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 值的建议也导致了我在这种特殊情况下遇到的更大问题的解决方案 - 创建不同的灰度,在我发布的解决方案中详细说明,这实际上并不是我提出的问题的解决方案。无论如何,谢谢!

【问题讨论】:

    标签: qt pyqt scale brush


    【解决方案1】:

    我相信通过变换无法达到目标:填充图案是在“场景”空间中生成的,然后根据视图比例因子对其应用变换,显然这会增加点之间的间距,没有变换可以防止这种情况,只有不同的图案绘制。

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

    由于我不认为 QBrush 提供这样的参数,您必须自己绘制点,使用前面段落中描述的距离计算。从 Python 完成,如果有点丢失,这可能会很慢,但是 PyQt5 总体上具有相当令人印象深刻的性能。

    并不是说您必须为这些点选择一个原点(角或中心是典型的选择),当您放大时,您会看到这些点向原点“滑动”,因为“添加了更多点” "到相反的末端/边缘。我认为您很有可能不喜欢这种效果,而且由于它不太容易实现,您可能需要考虑一种不基于点的不同视觉效果,例如渐变或 alpha 值。可能还有其他方法,例如 setDashPattern() 或在视图坐标中绘制休息,但可能不值得努力。

    【讨论】:

    • 嗯,很高兴听到第二个意见,这可能是不可能的。我没想过只使用 alpha 值,这可能是完美的解决方案。显示的总体目标是以不同的灰度显示不同的多边形 - 标准画笔图案在“正常”比例下工作,所以我什至还没有想到 alpha 值。谢谢 - 如果我找到一个好的结果,我会在这里发帖。
    • 是的,alpha 是最好的解决方案。谢谢你提出这个想法。回想起来总是很明显!我发布了一个单独的答案只是为了缩小确切的解决方案(并在允许时接受它)。
    • 很高兴听到这个消息。虽然,我写的内容让你从不同的角度看待问题,最终你得到了一个不同的问题(你知道答案)。但我尊重你的选择,最重要的是你没有掉进那个兔子洞:)
    • 好点,您的回答是对所提问题的回答。
    【解决方案2】:

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

    如果你有 n 个不同的项目都被不同的阴影,你可以遍历项目列表:

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

    其中 35 是根据看起来不错选择的,这样您就可以获得从一个项目到下一个项目所需的灰度分离量。

    这比子类化和转换要复杂得多!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-19
      • 1970-01-01
      • 2012-05-26
      • 2023-04-10
      • 2012-10-19
      • 1970-01-01
      • 2012-12-07
      • 2012-11-21
      相关资源
      最近更新 更多