You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的规则,但没有给按钮设置对应的对象名,导致规则未生效。

  1. 在ToggleButton的__init__中添加对象名:
    self.setObjectName("Lock_Toggle")
    
  2. 修改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;
    }
    
  3. 代码中可以删除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 11:21:18