Python 设置QMainWindow的样式表覆盖QWidget

Python 设置QMainWindow的样式表覆盖QWidget,python,pyqt5,Python,Pyqt5,我在PyQt5中制作了自己的进度条,这是一个QWdiget: class ProgressBar(QWidget): def __init__(self, parent): super(ProgressBar, self).__init__(parent) self.percentage = 0 #self.setGeometry(200, 200, 120, 120) self.label = La

我在PyQt5中制作了自己的进度条,这是一个QWdiget:

class ProgressBar(QWidget):

    def __init__(self, parent):
        super(ProgressBar, self).__init__(parent)

        self.percentage = 0
        
        #self.setGeometry(200, 200, 120, 120)

        self.label = Label(str(round(self.percentage * 100 / 360, 2)) + " %")

        self.layout = QVBoxLayout(self)
        self.layout.addWidget(self.label)

    def paintEvent(self, event):
        rectangle = QRect()
        rectangle.setX(10)
        rectangle.setY(10)
        rectangle.setWidth(100)
        rectangle.setHeight(100)

        gradient = QConicalGradient()
        gradient.setColorAt(0, QColor(5, 44, 50))
        gradient.setColorAt(1, QColor(178, 255, 246))
        gradient.setCenter(rectangle.center())
        gradient.setAngle(180 + self.width)

        pen = QPen()
        pen.setBrush(QBrush(gradient))
        pen.setWidth(self.width)
        pen.setCapStyle(Qt.RoundCap)

        painter = QPainter(self)
        painter.setRenderHint(QPainter.Antialiasing)
        painter.setPen(pen)

        painter.drawArc(rectangle, 180 * 16, self.angle*16)
...


当我在QMainWindow中添加它时,它的某些部分被我使用self.styleSheet设置为QMainWindow的颜色所覆盖。如果我评论这一行,背景是白色的,小部件不再被覆盖。如何更改此行为并设置背景色而不覆盖此内容? 我是这样添加的:

class MainWindow(QMainWindow):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setMinimumSize(660, 400)

        self.progress_bar = ProgressBar(self)
        self.setCentralWidget(self.progress_bar) 
        self.setWindowFlag(Qt.FramelessWindowHint)
        self.setFocusPolicy(Qt.StrongFocus)

        self.setStyleSheet("background-color: rgb(80, 90, 10)")

代码中有两个主要问题:

  • 您正在样式表中设置一个全局背景,这意味着所有的小部件都将具有该背景
  • 您正在将一个子小部件(标签)添加到进度栏,出于上述原因,标签将在样式表中设置背景;由于您还将标签添加到布局的进度条中,因此标签将覆盖整个可用空间,从而在进度条上进行绘制(绘制总是从下到上进行,子窗口小部件总是在其父窗口小部件的上方) 因此,解决方案是以正确的方式设置样式表。如果要仅为主窗口设置背景,请在选择器中指定类:

    class MainWindow(QMainWindow):
        def __init__(self):
            # ...
            self.setStyleSheet("QMainWindow {background-color: rgb(80, 90, 10);}")
    

    一般来说,应该避免使用“匿名”样式表,尤其是在父窗口小部件上,甚至在顶级窗口中设置时。阅读文档中的更多信息。

    如何将进度条添加到主窗口?您使用的样式表是什么?请提供。更新代码,抱歉误解。发布示例时,请确保它们实际上是可复制的。您的代码具有未知或键入错误的类名(
    Label
    ),
    self.width
    应使用
    self.width()
    (是QWidget标准属性,您不应覆盖它),
    self.angle
    从不声明。