QTextEdit 角不遵循样式中分配的边框边界 sheet

QTextEdit corners do not follow the border boundaries assigned in style sheet

如何修正 风格 sheet 中应用的 QTextEdit 小部件的尖角?
QTextEdit 的角位于 边界 的边界内是目的。

# importing libraries
from PySide2.QtWidgets import *
from PySide2.QtGui import *
from PySide2.QtCore import *
import sys

class Scene(QGraphicsScene):
    def __init__(self, _scene_width, _scene_height):
        super(Scene, self).__init__()
        self.setSceneRect(0, 0, _scene_width, _scene_height)
        map_center = _scene_width / 2
        te = QTextEdit()
        te.setStyleSheet(" border-radius: 30px;background-clip: border; background-color: rgb(220, 220,220); color: rgb(113, 113, 113); font: 14pt Vazir; border:4px solid; border-color: rgb(255,95,95);")
        te.insertPlainText("Test Text")
        te.setGeometry(map_center, map_center, 100, 100)
        self.addWidget(te)


class View(QGraphicsView):
    def __init__(self, _scene_width, _scene_height):
        super(View, self).__init__()
        self.scale_factor = 1
        self.scene_width = _scene_width
        self.scene_height = _scene_height
        scene = Scene(_scene_width, _scene_height)
        self.setScene(scene)
        self.showMaximized()

def main():
    app = QApplication(sys.argv)
    view = View(1000, 1000)
    view.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

代码结果

向图形场景添加小部件会使事情变得有点复杂。

问题是没有任何父级的小部件被视为顶级小部件(“windows”)是:即使您在它们周围设置了圆角边框,小部件仍将具有矩形形状,并且该形状将始终使用小部件的背景角色调色板绘制,包括圆边之外的内容。

由于您使用的是样式表,因此可以做的一件事是将背景调色板角色设置为 transparent(这是有效的,因为您在样式表中指定了背景并且该背景将被裁剪为边框):

        palette = te.palette()
        palette.setBrush(palette.Window, QBrush(Qt.transparent))
        te.setPalette(palette)

请注意,这可能 不够,因为某些样式(尤其是 Oxygen 样式)会在绘制小部件时向调色板添加默认背景 alpha 渐变,并且几乎你对此无能为力,至少在这种情况下。

在这种情况下,与顶级 windows 一样,您需要在小部件上设置 mask。考虑到掩码是 bit 贴图,这意味着应用 no 别名:像素被绘制或不被绘制。

        mask = QPainterPath()
        # the rectangle needs a 1 pixel adjustment to ensure that the aliasing is
        # correctly drawn, with the drawback of showing partial background pixels
        mask.addRoundedRect(QRectF(te.rect()).adjusted(-1, -1, 1, 1), 30, 30)
        te.setMask(QRegion(mask.toFillPolygon(QTransform()).toPolygon()))

最后,一些重要的注意事项:

  • 应始终谨慎使用样式表,因为它们通常仅应考虑用于特殊“例外”,因为它们的行为可能不稳定;
  • 不建议使用较大的边框半径值,因为它可能会剪切其他内容(最重要的是滚动条);
  • 一些样式以不同的方式应用样式表参数,尤其是 QAbstractScrollArea subclasses(如 QTextEdit);例如,对于 Oxygen 样式,我在文本区域内容 中得到圆角边框 ,而在 Windows 样式中我没有得到它;
  • 在样式表中使用特定语法通常是一种很好的做法,这意味着您应该指定小部件 class(这对于包含 QTextEdit 等子小部件的小部件很重要)和提供正确的缩进:
        te.setStyleSheet('''
            QTextEdit {
                border-radius: 30px;
                background-clip: border;
                background-color: rgb(220, 220,220);
                color: rgb(113, 113, 113);
                font: 14pt Vazir;
                border:4px solid;
                border-color: rgb(255,95,95);
            }
        ''')