如何自动更改 QListWidget 中所选项目的颜色
Posted
技术标签:
【中文标题】如何自动更改 QListWidget 中所选项目的颜色【英文标题】:how to automatically change the color of selected item in QListWidget 【发布时间】:2021-08-29 15:47:24 【问题描述】:我想更改 QListItem 中所选项目的颜色,我发现 qss 可能是一个解决方案。代码是:
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import sys
class Window(QWidget):
def __init__(self):
super().__init__()
with open('mainStyle.qss', 'r', encoding='utf-8') as file:
self.setStyleSheet(file.read())
# self.setStyleSheet('*font-size: 15px;background-color: rgb(150, 150, 150);'
# 'QListWidget::item:selectedbackground: rgb(128,128,255);')
self.setStyleSheet('QListWidget::item:selectedbackground: rgb(128,128,255);')
layout = QVBoxLayout()
self.setLayout(layout)
listWidget = QListWidget()
layout.addWidget(listWidget)
w1 = QWidget()
w1Item = QListWidgetItem()
w1Item.setSizeHint(QSize(150, 150))
listWidget.insertItem(0, w1Item)
listWidget.setItemWidget(w1Item, w1)
w2 = QWidget()
w2Item = QListWidgetItem()
w2Item.setSizeHint(QSize(150, 150))
listWidget.insertItem(1, w2Item)
listWidget.setItemWidget(w2Item, w2)
if __name__ == '__main__':
app = QApplication(sys.argv)
win = Window()
win.show()
app.exec_()
我们可以看到当item被选中时颜色变成了蓝色。
但是,我需要为其他小部件提供一般背景颜色。所以我改变了风格
self.setStyleSheet('QListWidget::item:selectedbackground: rgb(0,0,255);')
到
self.setStyleSheet('*font-size: 15px;background-color: rgb(150, 150, 150);'
'QListWidget::item:selectedbackground: rgb(0,0,0);')
然后,我发现QListWidget::item:selected
不起作用。当我选择一个项目时颜色不会改变。
我的代码有什么问题?
【问题讨论】:
【参考方案1】:问题是您正在为项目设置 QWidget,并且由于您使用的是 通用选择器(带有通配符),结果是 all QWidget 将具有该背景颜色,包括作为列表视图的项目小部件添加的那些。
您用于 :selected
伪的颜色仅对视图绘制的项目有效,因为项目小部件从通用选择器中设置了自己的背景,因此该背景将不可见。
解决方案是使用适当的选择器组合,确保规则仅匹配列表视图中具有可用选择器的 子项,并为这些小部件设置透明颜色。
一种可能性是为小部件设置一个自定义属性,该属性必须在之前将小部件添加到列表中(否则,您需要在添加之后设置样式表他们,或请求style.unpolish()
)。
self.setStyleSheet('''
QWidget
font-size: 15px;
background: rgb(150, 150, 150);
QListWidget::item:selected
background: rgb(128,128,255);
QListWidget QWidget[widgetItem=true]
background: transparent;
''')
# ...
w1 = QWidget()
w1.setProperty('widgetItem', True)
# ...
w2 = QWidget()
w2.setProperty('widgetItem', True)
# ...
另一种方法是为要添加到项目视图的小部件使用“空”子类:
class CustomItemWidget(QWidget): pass
class Window(QWidget):
def __init__(self):
super().__init__()
self.setStyleSheet('''
QWidget
font-size: 15px;
background: rgb(150, 150, 150);
QListWidget::item:selected
background: rgb(128,128,255);
CustomItemWidget
background: transparent;
''')
# ...
w1 = CustomItemWidget()
# ...
w2 = CustomItemWidget()
# ...
考虑到对颜色使用通用选择器通常不是一个好主意,因为它可能导致不一致的行为,尤其是对于复杂的小部件:例如,滚动区域(如 QListWidget)的滚动条可能没有正确设置样式并且可能甚至变得无法使用。
如果您打算为所有小部件使用通用背景颜色,最好设置应用程序调色板的Window
角色:
app = QApplication(sys.argv)
palette = app.palette()
palette.setColor(palette.Window, QColor(150, 150, 150))
app.setPalette(palette)
# ...
通过这种方式,当前样式将准确地知道何时将该颜色用作背景,或用作其他 UI 元素的组件。
【讨论】:
以上是关于如何自动更改 QListWidget 中所选项目的颜色的主要内容,如果未能解决你的问题,请参考以下文章
SwiftUI:如何更改 TabbedView 中所选项目的图像
Xamarin Forms:如何更改 flowlistview 中所选项目的背景颜色?
如何获取 QListWidget::selectedItems() 的索引?