Python QTextEdit角点不遵循样式表中指定的边界边界

Python QTextEdit角点不遵循样式表中指定的边界边界,python,pyqt5,border,pyside2,qtextedit,Python,Pyqt5,Border,Pyside2,Qtextedit,如何校正QTextEdit小部件在样式表中应用的锐角? QTextEdit的角位于边界的内部是目的 守则的结果 将小部件添加到图形场景会使事情变得更加复杂 问题是,没有任何父控件的小部件被视为顶级小部件(“窗口”):即使在它们周围设置了圆角边框,小部件仍将具有矩形形状,并且该形状将始终使用小部件的背景角色调色板绘制,包括圆角外的内容 由于您使用的是样式表,可以做的一件事是将背景调色板角色设置为透明(这是有效的,因为您正在样式表中指定背景,并且背景将被剪裁到边框): 请注意,这可能还不够,因为某

如何校正
QTextEdit
小部件在样式表中应用的锐角?
QTextEdit
的角位于边界的内部是目的

守则的结果


将小部件添加到图形场景会使事情变得更加复杂

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

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

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

在这种情况下,与顶级窗口一样,您需要在小部件上设置一个。考虑到掩码是位图,意味着<强>>不/强>混叠:像素被绘制或它们不是。

        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()))
最后,一些重要的考虑:

  • 样式表应始终小心使用,因为它们通常仅用于特殊的“例外”,因为它们的行为可能不稳定
  • 不建议对边框半径使用较大的值,因为它可能会剪切其他内容(最重要的是,滚动条)
  • 一些样式以不同的方式应用样式表参数,特别是QabStretchScrollArea子类(如QTextEdit);例如,使用Oxygen样式时,我在文本区域内容中获得圆角边框,而在Windows样式中没有
  • 在样式表中使用特定语法通常是一种好的做法,这意味着您应该指定小部件类(这对于包含子小部件(如QTextEdit)的小部件很重要)并提供正确的缩进:

此文本编辑是添加到小部件[布局]还是顶层窗口?如果没有,您是否为其任何父窗口小部件设置了样式表?@musicamante它被添加到
qgraphicscene
。不,您将小部件添加到QGraphicscene是您应该提到的一个重要方面。如果使用
te.setAttribute(QtCore.Qt.WA_NoSystemBackground,True)
,会发生什么情况?@musicamante
te.setAttribute(QtCore.Qt.WA_NoSystemBackground,True)
没有帮助;除了
QTextEdit
的文本以外的所有内容都消失了。我已经更新了问题,使其更易于测试。小部件内部的文本编辑和将小部件添加到场景解决了问题,正如您注意到的将小部件直接添加到场景的问题。对于这个示例代码,调色板方法不会产生任何结果。如前所述,使用遮罩会产生像素化的角点。感谢您的回答和关于样式表的额外考虑。我们可以跳过这些指南中的许多问题。@Eftekhari如前所述,不同的样式以稍微不同的方式应用样式表;样式表基本上覆盖了基础样式的功能,因此,如果样式使用自己的规则绘制背景,无论设置了什么调色板,它都会以某种方式绘制背景。注意,作为一种解决方法,您可以仅使用
te.setStyle(QStyleFactory.create('stylename'))
根据
QStyleFactory.keys()
返回的列表设置QTextEdit的样式。通常,“fusion”样式(也应该在Windows上提供)是最标准、最兼容的。谢谢。现在需要使用小部件将文本编辑添加到场景中,并且基于小部件占用ram的事实,如果没有ram溢出,场景中怎么会有成百上千的小部件/文本编辑?在地图的缩小状态下,所有小部件/文本编辑都需要可见,以让用户全面了解地图上发生的事情(不是地理地图)。Qt具有相当好的内存管理,拥有数百个小部件通常不是问题。即使有一千个基本的小部件(不是项目视图,尤其是大型号的小部件,其消耗量会稍微多一些),内存消耗也可能只会增加5-10mb。此外,QGraphicsView和QGraphicscene即使有数千项也具有良好的cpu/内存性能(请参阅),唯一的瓶颈是最终的python实现(通常在重写QGraphicsItem的
paint()
时)。
        palette = te.palette()
        palette.setBrush(palette.Window, QBrush(Qt.transparent))
        te.setPalette(palette)
        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()))
        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);
            }
        ''')