QListWidget复选框样式问题:自定义样式后复选框重复显示
解决QListWidget复选框重复显示及文本截断问题
问题分析
复选框重复显示、项文本被截断,是因为自定义QListView::indicator样式时未完全覆盖默认复选框的绘制逻辑,同时列表项内边距未给复选框预留足够空间,导致文本被挤压。
修复方案
1. 完全覆盖默认复选框样式
给QListView::indicator添加明确的尺寸、位置属性,彻底替换默认复选框,避免重复显示。
2. 调整列表项内边距
修改QListView::item的内边距,给左侧复选框留出足够宽度,防止文本被截断。
修改后的代码
样式表代码
OPTION_CLIENT_MAIN = ( "QListWidget" "{" f"border : 3px solid {Palette.PRIMARY_COLOR.value};" f"color : {Palette.SECONDARY_COLOR.value};" "border-radius : 15%;" "outline : 0px;" "padding : 5px;" "}" "QListView::item" "{" "padding : 15px 15px 15px 40px;" # 左侧预留40px空间给复选框 "outline : 0px;" "}" "QListView::item:selected" "{" f"border : 3px dashed {Palette.SECONDARY_COLOR.value};" f"background : {Palette.PRIMARY_COLOR.value};" "border-radius : 15%;" f"color : {Palette.COMMON_COLOR_W.value};" "}" "QListView::item:hover" "{" f"background : {Palette.PRIMARY_COLOR.value};" f"color : {Palette.COMMON_COLOR_W.value};" "}" "QListView::indicator" "{" "width: 20px;" # 设置复选框宽度 "height: 20px;" # 设置复选框高度 "subcontrol-origin: padding;" "subcontrol-position: left center;" # 复选框靠左垂直居中 "}" "QListView::indicator:checked" "{" f"background-color : {Palette.COMMON_COLOR_G.value};" "border: 2px solid {Palette.SECONDARY_COLOR.value};" "border-radius: 3px;" "}" "QListView::indicator:unchecked" "{" f"background-color : {Palette.COMMON_COLOR_R.value};" "border: 2px solid {Palette.SECONDARY_COLOR.value};" "border-radius: 3px;" "}" )
补充检查代码
若仍存在重复显示,确认列表项仅启用内置复选框,避免额外添加自定义控件:
for i in range(self.clientListWidget.count()): item = self.clientListWidget.item(i) # 确保仅启用内置复选框标记 item.setFlags(item.flags() | Qt.ItemIsUserCheckable) if con.isActiveClient(item.text()): item.setCheckState(Qt.Checked) else: item.setCheckState(Qt.Unchecked)
内容的提问来源于stack exchange,提问作者A-Wilson-JP
相关产品推荐
相关产品推荐

