python - 如何自动更改 QListWidget 中所选项目的颜色
问题描述
我想更改 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: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_()
我们可以看到,当项目被选中时,颜色变为蓝色。
但是,我需要为其他小部件提供一般背景颜色。所以我改变了风格
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
不工作。当我选择一个项目时颜色不会改变。
我的代码有什么问题?
解决方案
问题是您正在为该项目设置一个 QWidget,并且由于您使用的是通用选择器(带有通配符),结果是所有QWidget 都将具有该背景颜色,包括那些作为项目小部件添加的列表看法。
您用于:selected
伪的颜色仅对视图绘制的项目有效,因为项目小部件有自己的通用选择器设置的背景,该背景将不可见。
解决方案是使用正确的选择器组合,确保规则仅匹配列表视图中具有可用选择器的子项,并为这些小部件设置透明颜色。
一种可能性是在将小部件添加到列表之前必须设置小部件的自定义属性(否则,您需要在添加它们之后设置样式表,或者请求 a 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 元素的组件。
推荐阅读
- reactjs - Mongoose .find() 正在返回一个对象,其键看起来像数组的索引,而不是对象数组
- go - 如何从打车中读取 stix 数据
- git - 在带有子模块的 git 存储库中分支
- excel - 如何将 3 列与 Excel 中的另外 3 列进行匹配/比较?
- angular - Angular CLI:从 Ng 测试代码覆盖范围中排除方法和部分
- python - 多行 Json 不适用于 python json.loads
- cookies - 如果机器人框架中的测试用例失败,则重新运行整个测试套件
- dart - 时间到单词转换器
- javascript - 将 React 中的 div 导出为 PDF
- python - 使用 selenium 抓取网页以从更多事件按钮中获取更多信息