调用setSizePolicy参数类型错误,如何让QPushButton固定为内容尺寸?
错误原因与解决办法
1. 直接修复报错
你触发错误的核心问题是:setSizePolicy()的参数传错了。这个方法接受的是QSizePolicy.Policy枚举值(比如Fixed)或者完整的QSizePolicy对象,而你错误地把sizeHint()返回的QSize尺寸对象传了进去。
看你代码里的重复操作:
self.topbar_widgets["home_button"].setSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed) # 下面这行是错误调用,直接删掉 self.topbar_widgets["home_button"].setSizePolicy(self.topbar_widgets["home_button"].sizeHint(), self.topbar_widgets["home_button"].sizeHint())
把所有这类传sizeHint()的错误setSizePolicy调用全部删掉,就能解决报错。而且当你把sizePolicy设为Fixed时,按钮会自动使用自身的sizeHint()作为固定尺寸,完全不需要额外传尺寸值。
2. 代码优化方案
你的代码重复代码太多,用循环批量创建按钮能大幅简化:
class TopBar(QtWidgets.QWidget): def __init__(self, stack=None, pages=None): super().__init__() self.stack = stack self.pages = pages self.setup_ui() def setup_ui(self): layout = QtWidgets.QHBoxLayout(self) # 可选:去掉布局默认间距和边距,让按钮更紧凑 layout.setSpacing(0) layout.setContentsMargins(0,0,0,0) # 按钮配置:键名、显示文本、图标路径、对应页面 button_configs = [ ("home_button", " Home", "icons/home.png", "home"), ("wallpaper_grouping_button", " Wallpaper Grouping", "icons/folder.png", "wallpaper_grouping"), ("shuffle_rules_button", " Shuffle Rules", "icons/settings.png", "shuffle_rules"), ("report_bug_button", "", "icons/bug.png", "report_bug"), ("settings_button", "", "icons/gear.png", "settings"), ] self.topbar_widgets = {} for btn_key, text, icon_path, page_key in button_configs: btn = QtWidgets.QPushButton(text) # 设置固定尺寸策略 btn.setSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed) # 设置图标 btn.setIcon(QtGui.QIcon(icon_path)) btn.setIconSize(QtCore.QSize(24,24)) # 绑定页面切换(用默认参数避免lambda循环陷阱) btn.clicked.connect(lambda _, pk=page_key: self.stack.setCurrentWidget(self.pages[pk])) # 添加到布局和字典 layout.addWidget(btn) self.topbar_widgets[btn_key] = btn
优化细节:
- 用配置列表+循环批量生成按钮,后续新增/修改按钮只需要改配置,不用重复写相同逻辑
- 修复了原lambda的陷阱:原代码里的lambda会捕获循环变量的最终值,导致所有按钮点了都跳最后一个页面,这里用
pk=page_key固化每个按钮对应的页面 - 可选调整布局的间距和边距,让顶部栏更整洁
- 如果按钮还是有多余空白,可以加
btn.setContentsMargins(0,0,0,0)去掉按钮内部的默认边距,让按钮完全贴合内容尺寸
内容的提问来源于stack exchange,提问作者RoboticsEqualsFun
相关产品推荐
相关产品推荐

