PySide6中QSS样式表导致切换按钮需点击后才正常调整尺寸
问题描述
我实现了一款点击可切换锁定/解锁图标的ToggleButton:
- 未应用全局.qss样式表时,按钮能正常保持32x32像素的预期尺寸;
- 应用样式表后,按钮初始会占用普通QPushButton的尺寸,仅点击一次后才会变为目标大小;
- 尝试在ToggleButton类中设置
self.setStyleSheet("")避免继承全局样式,但问题仍未解决。
相关代码及.qss内容如下:
ToggleButton代码
class ToggleButton(QPushButton): def __init__(self): super().__init__() # 获取图片路径 self.locked = "Locked_Clipart.png" self.unlocked = "Un_Locked_Clipart.png" # 设置初始图标 self.setIcon(QIcon(self.locked)) # 设置图标和按钮尺寸为32x32 self.setIconSize(QSize(32, 32)) self.setFixedSize(32, 32) self.setMinimumWidth(32) self.setMaximumWidth(32) self.adjustSize() # 尝试清空样式表 self.setStyleSheet("") # 启用切换功能 self.setCheckable(True) self.toggled.connect(self.update_icon) def update_icon(self, checked): if checked == False: self.setIcon(QIcon(self.locked)) else: self.setIcon(QIcon(self.unlocked)) # 再次设置尺寸(不确定是否需要) self.setIconSize(QSize(32, 32)) self.setFixedSize(32, 32)
主窗口代码
class MainWindow(QWidget): def __init__(self): super().__init__() layout = QVBoxLayout() # 添加多个ToggleButton count = 1 while count < 10: button = ToggleButton() layout.addWidget(button) count += 1 self.setLayout(layout) app = QApplication([]) # 加载全局样式表 qss_path = "style.qss" try: with open(qss_path, "r") as file: stylesheet = file.read() except FileNotFoundError: print(f"未找到样式表文件:{qss_path}") stylesheet = "" if stylesheet: app.setStyleSheet(stylesheet) window = MainWindow() window.show() app.exec()
.qss文件内容
QPushButton { background-color: rgb(0, 128, 200); color: white; border: 1px solid #000000; padding: 5px; border-radius: 4px; min-width: 85px; margin: 0px; height: 15px } QPushButton#Lock_Toggle { background-color: #f0f0f0; /* 浅灰色背景 */ color: black; /* 黑色文字 */ border: 1px solid #a9a9a9; /* 灰色边框 */ padding: 4px 8px; /* 内边距 */ border-radius: 3px; } QPushButton:hover { background-color: rgb(0, 164, 242); } QPushButton:pressed { background-color: rgb(79, 198, 255); }
解决方案
问题根源是全局QSS的QPushButton规则设置了min-width:85px和height:15px,这些样式优先级高于代码中设置的固定尺寸,点击后尺寸恢复是因为update_icon方法重新强制设置了一次尺寸,但初始渲染时样式表规则先生效。
推荐以下两种解决方法:
方法1:利用对象名匹配专属QSS规则(最优)
你已经在QSS中写了QPushButton#Lock_Toggle的规则,但没有给按钮设置对应的对象名,导致规则未生效。
- 在ToggleButton的
__init__中添加对象名:self.setObjectName("Lock_Toggle") - 修改QSS中
QPushButton#Lock_Toggle的规则,重置尺寸和内边距:QPushButton#Lock_Toggle { background-color: #f0f0f0; color: black; border: 1px solid #a9a9a9; padding: 0px; /* 去掉内边距,避免图标被挤压 */ border-radius: 3px; min-width: 32px; max-width: 32px; min-height: 32px; max-height: 32px; } - 代码中可以删除
setStyleSheet("")、setMinimumWidth、setMaximumWidth和adjustSize,因为setFixedSize已经足够锁定尺寸。
方法2:在代码中强制覆盖样式表规则
如果不想修改全局QSS,直接在ToggleButton中设置专属样式表,覆盖全局规则:
# 替换原来的self.setStyleSheet("") self.setStyleSheet(""" QPushButton { min-width: 32px; max-width: 32px; min-height: 32px; max-height: 32px; padding: 0px; } """)
内容的提问来源于stack exchange,提问作者user23346328
相关产品推荐
相关产品推荐

