PySide6中QLabel调用unpolish/polish后padding样式不生效问题
QLabel切换text后QSS中padding样式不生效的原因及解决办法
我定义了如下QSS样式表和Python代码,点击按钮后将QLabel的text改为“ERR”,并调用unpolish、polish及update方法,期望QLabel的padding从10px变为100px,但只有padding未生效,背景色、字体大小等样式正常更新,请问为何只有padding样式未生效?
QSS样式表
.QLabel[text="OK"]{ background-color: rgb(0,255,0); color: rgb(255,250,250); font-size: 24pt; padding: 10px; } .QLabel[text="ERR"]{ background-color: rgb(255,0,0); color: rgb(255,250,250); font-size: 24pt; padding: 100px; }
Python代码
from PySide6 import QtWidgets from PySide6.QtCore import Qt class MyWindow(QtWidgets.QWidget): def set_style(self): with open('./style', 'r') as f: self.setStyleSheet(f.read()) def __init__(self): super().__init__() self.set_style() self.setupUi() def setupUi(self): self.label = QtWidgets.QLabel('OK', self) self.label.setAlignment(Qt.AlignCenter) self.button = QtWidgets.QPushButton('Button', self) vlayout = QtWidgets.QVBoxLayout(self) vlayout.setAlignment(Qt.AlignCenter) vlayout.addWidget(self.label) vlayout.addWidget(self.button) self.button.clicked.connect(self.btn_clicked) self.show() def btn_clicked(self, a): self.label.setText("ERR") self.label.style().unpolish(self.label) self.label.style().polish(self.label) self.update() if __name__ == "__main__": app = QtWidgets.QApplication([]) win = MyWindow() app.exec_()
效果对比
点击前效果:
点击后效果:
原因分析
QLabel的padding属于布局相关的样式属性,这类属性的生效依赖于控件自身尺寸的重新计算。当QLabel处于布局容器中时,布局系统会根据控件初始的尺寸策略分配空间,仅调用unpolish、polish和update只能触发样式重绘,无法让布局系统感知到padding变化带来的尺寸需求变更,导致padding样式看似未生效。
解决办法
- 方法一:触发QLabel自身尺寸重计算
在更新text并完成样式刷新后,调用adjustSize()方法,让QLabel根据新的padding重新计算自身大小:
def btn_clicked(self, a): self.label.setText("ERR") self.label.style().unpolish(self.label) self.label.style().polish(self.label) self.label.adjustSize() # 触发尺寸重计算 self.update()
- 方法二:更新父布局
如果QLabel的尺寸受父布局约束,也可以直接更新父布局,让布局重新排列控件:
def btn_clicked(self, a): self.label.setText("ERR") self.label.style().unpolish(self.label) self.label.style().polish(self.label) self.layout().update() # 更新父布局 self.update()
内容的提问来源于stack exchange,提问作者HyunYoung Go
相关产品推荐
相关产品推荐

