微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何自动更改 QListWidget

如何解决如何自动更改 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,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_()

enter image description here

我们可以看到,当项目被选中时,颜色变成了蓝色。

但是,我需要为其他小部件提供通用背景颜色。所以我改变了风格

self.setStyleSheet('QListWidget::item:selected{background: rgb(0,255);}')

self.setStyleSheet('*{font-size: 15px;background-color: rgb(150,150);}'
                   'QListWidget::item:selected{background: rgb(0,0);}')

然后,我发现 QListWidget::item:selected 不起作用。当我选择一个项目时颜色不会改变。

我的代码有什么问题?

解决方法

问题在于您正在为项目设置 QWidget,并且由于您使用的是通用选择器(带有通配符),结果是全部 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,255);
            }
            CustomItemWidget {
                background: transparent;
            }
        ''')

        # ...
        w1 = CustomItemWidget()
        # ...
        w2 = CustomItemWidget()
        # ...

考虑到对颜色使用通用选择器通常不是一个好主意,因为它会导致不一致的行为,尤其是对于复杂的小部件:例如,滚动区域的滚动条(如 QListWidget)可能没有正确的样式并且可以甚至变得无法使用。
如果您打算为所有小部件使用通用的背景颜色,最好设置应用程序调色板的 Window 角色:

    app = QApplication(sys.argv)
    palette = app.palette()
    palette.setColor(palette.Window,QColor(150,150))
    app.setPalette(palette)
    # ...

通过这种方式,当前样式将确切知道何时使用该颜色作为背景,或作为其他 UI 元素的组件。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。