如何自动更改QListWidget中选定项目的颜色
how to automatically change the color of selected item in QListWidget
我想更改 QListItem 中 selected 项目的颜色,我发现 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:selected{background: rgb(128,128,255);}')
self.setStyleSheet('QListWidget::item:selected{background: 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_()
我们可以看到项目 selected 时颜色变为蓝色。
但是,我需要为其他小部件提供通用背景色。所以我把样式从
self.setStyleSheet('QListWidget::item:selected{background: rgb(0,0,255);}')
到
self.setStyleSheet('*{font-size: 15px;background-color: rgb(150, 150, 150);}'
'QListWidget::item:selected{background: rgb(0,0,0);}')
然后,我发现QListWidget::item:selected
不行。当我 select 一个项目时,颜色不会改变。
我的代码有什么问题?
问题是您正在为项目设置 QWidget,并且由于您使用的是 通用选择器 (带有通配符),结果是 所有 QWidget 将具有该背景颜色,包括那些添加为列表视图的项目小部件的颜色。
您用于 :selected
pseudo 的颜色仅对视图绘制的项目有效,因为项目小部件从通用选择器中设置了自己的背景,该背景将不可见。
解决方案是使用适当的选择器组合,确保规则仅匹配具有可用选择器的列表视图的 children,并为这些小部件设置透明颜色。
一种可能性是为必须设置的小部件设置自定义属性 在将小部件添加到列表之前(否则,您需要设置样式表在 添加它们之后,或请求 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:
class CustomItemWidget(QWidget): 通过
class Window(QWidget):
def __init__(自我):
超级().__init__()
self.setStyleSheet('''
QWidget {
字体大小:15px;
背景:RGB(150、150、150);
}
QListWidget::item:selected{
背景:RGB(128,128,255);
}
<b>CustomItemWidget</b> {
背景:透明;
}
''')
# ...
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 元素的组件。
我想更改 QListItem 中 selected 项目的颜色,我发现 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:selected{background: rgb(128,128,255);}')
self.setStyleSheet('QListWidget::item:selected{background: 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_()
我们可以看到项目 selected 时颜色变为蓝色。
但是,我需要为其他小部件提供通用背景色。所以我把样式从
self.setStyleSheet('QListWidget::item:selected{background: rgb(0,0,255);}')
到
self.setStyleSheet('*{font-size: 15px;background-color: rgb(150, 150, 150);}'
'QListWidget::item:selected{background: rgb(0,0,0);}')
然后,我发现QListWidget::item:selected
不行。当我 select 一个项目时,颜色不会改变。
我的代码有什么问题?
问题是您正在为项目设置 QWidget,并且由于您使用的是 通用选择器 (带有通配符),结果是 所有 QWidget 将具有该背景颜色,包括那些添加为列表视图的项目小部件的颜色。
您用于 :selected
pseudo 的颜色仅对视图绘制的项目有效,因为项目小部件从通用选择器中设置了自己的背景,该背景将不可见。
解决方案是使用适当的选择器组合,确保规则仅匹配具有可用选择器的列表视图的 children,并为这些小部件设置透明颜色。
一种可能性是为必须设置的小部件设置自定义属性 在将小部件添加到列表之前(否则,您需要设置样式表在 添加它们之后,或请求 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:
class CustomItemWidget(QWidget): 通过
class Window(QWidget):
def __init__(自我):
超级().__init__()
self.setStyleSheet('''
QWidget {
字体大小:15px;
背景:RGB(150、150、150);
}
QListWidget::item:selected{
背景:RGB(128,128,255);
}
<b>CustomItemWidget</b> {
背景:透明;
}
''')
# ...
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 元素的组件。