是否可以从 qt5 中的图层将文本渲染为 "cut out"?

Is it possible to render text as being "cut out" from a layer in in qt5?

我是 ui 设计的新手,我想知道如何实现将图层顶部的一些基于字体的文本绘制为来自所述图层的 "cut-out" 的效果,如果这甚至是可能的。

Basically akin to the example below 理想情况下,文本所在的图层 "cut out" 本身可以产生效果,例如半透明 and/or 模糊,如果所述图层在背景上有平移,效果仍然有效。

您可以使用 QPainterPathQPainter

使用QPainterPath定义图像上的白色部分。首先,创建一个带有矩形(圆角矩形)的路径。然后,将具有正确字体的文本添加到路径中。默认情况下,填充规则将从矩形中删除文本。

使用QPainter在背景图片上绘制路径。不要忘记启用抗锯齿以获得更好的渲染效果。

一个例子:

class Widget(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

        label = QLabel(self)
        label.setPixmap(self.makePixmap("knockout"))

    def makePixmap(self, text):
        background = QPixmap(600, 80)
        background.fill(Qt.red)      # Your background image

        textMask = QPainterPath() 
        textMask.addRect(75, 20, 300, 40) # The white part
        textMask.addText(QPoint(90, 50), QFont("Helvetica [Cronyx]", 24), text) # the path will substract the text to the rect

        painter = QPainter(background)
        painter.setRenderHints(QPainter.Antialiasing | QPainter.TextAntialiasing)

        painter.fillPath(textMask, QBrush(Qt.white)) # Will draw the white part with the text "cut out"

        painter.end()
        return background