如何修改QListWidget选中项样式:仅保留青色边框
解决QListWidget选中项仅显示边框并保留原有背景色的问题
问题原因
设置background-color: transparent后,不同Qt样式(如fusion、普通样式)仍会通过自身绘制逻辑叠加选中背景:fusion样式会添加半透明灰色层,普通样式则用白色背景覆盖item原有颜色。这是因为transparent只是让样式绘制的背景透明,但部分样式会有额外的选中背景绘制步骤。
解决方案1:修改样式表(推荐)
使用background: none完全取消选中状态的背景绘制,同时预留边框空间避免内容被遮挡:
class NewListWidget(QListWidget): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setStyleSheet(""" QListWidget::item { padding: 2px; /* 给2px边框预留空间,防止内容被遮挡 */ } QListWidget::item:selected { background: none; /* 完全禁用选中背景绘制 */ border: 2px solid #00AEEF; color: inherit; /* 保留item原有文本颜色 */ } """)
解决方案2:重写paintEvent手动绘制边框
如果样式表方法在特定样式下仍有问题,可以通过重写绘制事件,手动给选中项添加边框,完全不干扰原有背景:
from PySide6.QtGui import QPainter, QPen class NewListWidget(QListWidget): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # 移除原有样式表设置 self.setStyleSheet("") def paintEvent(self, event): # 先执行默认绘制,保留item原有背景和文本 super().paintEvent(event) painter = QPainter(self.viewport()) # 设置边框样式 pen = QPen(QColor("#00AEEF"), 2) painter.setPen(pen) # 遍历所有选中项,绘制边框 for item in self.selectedItems(): item_rect = self.visualItemRect(item) # 调整矩形位置,避免边框超出item范围 item_rect.adjust(1, 1, -1, -1) painter.drawRect(item_rect)
效果验证
修改后,无论使用fusion还是普通样式,选中项都会仅显示青色边框,同时保留item自身设置的背景色。
内容的提问来源于stack exchange,提问作者ParsaTheH
相关产品推荐
相关产品推荐

