【问题标题】:QTextEdit corners do not follow the border boundaries assigned in style sheetQTextEdit 角不遵循样式表中分配的边界边界
【发布时间】:2020-10-12 07:28:18
【问题描述】:

如何更正样式表中应用的QTextEdit 小部件的尖角?
QTextEdit 的角落在 border 的边界内是目的。

# 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()

代码结果

【问题讨论】:

  • 此文本编辑是添加到小部件 [布局] 还是顶级窗口?如果不是,您是否为其任何父小部件设置了样式表?
  • @musicamante 它被添加到QGraphicsScene。没有。
  • 您将小部件添加到 QGraphicsScene 的事实是您应该提到的一个重要方面。如果你使用te.setAttribute(QtCore.Qt.WA_NoSystemBackground, True)会发生什么?
  • @musicamante te.setAttribute(QtCore.Qt.WA_NoSystemBackground, True) 没有帮助;除了QTextEdit 的文字之外的所有内容都消失了。我已更新问题以使其更易于测试。

标签: python pyqt5 border pyside2 qtextedit


【解决方案1】:

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

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

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

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

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

在这种情况下,与顶级窗口一样,您需要在小部件上设置mask。考虑蒙版是图,这意味着应用了锯齿:像素被绘制或不被绘制。

        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 子类(如 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);
            }
        ''')

【讨论】:

  • widget 中的 textedit 并将 widget 添加到 scene 解决了问题,因为您注意到将 widget 直接添加到 scene 的问题。使用此示例代码,palette 方法没有结果。正如您所解释的,使用 mask 会导致像素化角。感谢您的回答以及关于 样式表 的额外考虑。使用这些指南可以跳过许多问题。
  • @Eftekhari 如前所述,不同的样式应用样式表的方式略有不同;样式表从根本上覆盖了底层样式所做的事情,因此如果样式按照自己的规则绘制背景,那么无论设置什么调色板,它都会以某种方式绘制背景。请注意,作为一种解决方法,您可以根据QStyleFactory.keys() 返回的列表仅使用te.setStyle(QStyleFactory.create('stylename')) 为QTextEdit 设置样式。一般来说,“融合”风格(在 Windows 上也应该可用)是最标准和合规的。
  • 谢谢。既然需要使用小部件将文本编辑添加到场景中,并且基于小部件消耗内存的事实,那么场景如何在没有内存溢出的情况下拥有数百个小部件/文本编辑?在地图的缩小状态下,所有小部件/文本编辑都需要可见,以便用户全面了解地图上发生的情况(它不是地理地图)。
  • Qt 的内存管理非常好,拥有数百个小部件通常不是问题。即使有 1000 个基本小部件(不是项目视图,尤其是大型模型更消耗一些),内存消耗可能只会增加 5-10mb。此外,即使有数千个项目,QGraphicsView 和 QGraphicsScene 也具有良好的 CPU/内存性能(参见 40000 chips example,唯一的瓶颈是最终的 Python 实现(通常在覆盖 QGraphicsItem 的 paint() 时)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-04
  • 2017-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多