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

标签 qt pyqt scale brush

在 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 值的建议也导致了我在这种特殊情况下遇到的更大问题的解决方案 - 创建不同的灰度,在我发布的解决方案中详细说明,这实际上并不是我提出的问题的解决方案。不管怎样,谢谢!

最佳答案

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

为了获得您想要的效果,画笔必须有一个参数来控制场景坐标中点之间的距离;然后在矩形的 Paint() 方法中,您可以根据当前 View 缩放系数设置此参数值(通过 Paint() 方法的 style 参数)。

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

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

关于qt - QBrush - 缩放标准填充点画图案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41538932/

相关文章:

qt - Qt 5.1 中的 glGenVertexArrays 和 glBindVertexArrays 在哪里?

python - 如何在QDateEdit弹出QCalendarWidget中添加Today按钮

python - 如何有一个目录对话框

Javascript:遍历对象列表并缩放已知最小值和最大值之间的值

c++ - 如何连接两个程序(c++、qt)

c++ - 在 Qt 中获取耗时

c++ - 服务器在已经处理请求时收到请求时崩溃

python-3.x - QMainWindow 与 QWidget

android - 如何剪切图像的某些部分并将其显示在 ImageView 中

ios - 如何知道 UIView 的当前比例?