Python 如何更改未选定元素的样式?

Python 如何更改未选定元素的样式?,python,pyqt,pyqt5,qtstylesheets,Python,Pyqt,Pyqt5,Qtstylesheets,我试图用PyQt5构建文件夹查看器,但遇到了一个问题。 为了标记选定的文件或目录,我制作了一个eventFilter,它设置QLabel元素的属性“selected”,并对其应用一些样式。 问题是,当我将“selected”设置为True时-文件/文件夹被选中(应用于它的样式),但当我尝试将“selected”设置为以前选择的元素中的任何元素时,它都不起作用(属性更改),但样式不会应用于它(它不是取消选择的,不会返回到未选择的状态)。 以下是我的代码片段: import sys import o

我试图用PyQt5构建文件夹查看器,但遇到了一个问题。 为了标记选定的文件或目录,我制作了一个eventFilter,它设置QLabel元素的属性“selected”,并对其应用一些样式。 问题是,当我将“selected”设置为True时-文件/文件夹被选中(应用于它的样式),但当我尝试将“selected”设置为以前选择的元素中的任何元素时,它都不起作用(属性更改),但样式不会应用于它(它不是取消选择的,不会返回到未选择的状态)。 以下是我的代码片段:

import sys
import os

from PyQt5.QtWidgets import (QApplication, QShortcut, QLabel, QPushButton,
                         QGridLayout, QWidget, QMainWindow, QLineEdit,
                         QVBoxLayout, QShortcut, QAction, QMessageBox,
                         QHBoxLayout, QComboBox, QCheckBox, QScrollArea)
from PyQt5.QtGui import QIntValidator, QIcon
from PyQt5.QtCore import Qt, QObject, QEvent, QSize


class MyWindow(QMainWindow):

    def __init__(self, parent=None):
        super(MyWindow, self).__init__(parent)
        self.setGeometry(600, 300, 700, 500)
        self.setWindowTitle('Folder imitator')
        self.homeDirectory = os.path.splitdrive(os.getcwd())[0]+os.path.sep
        self.currentDirectory = self.homeDirectory
        self.setStyleSheet(open('style.css').read())
        self.selected = None
        self.initUI()

    def initUI(self):
        cenWidget = QWidget(self)
        mainVertLayout = QVBoxLayout(cenWidget)

        scroll = QScrollArea()
        scroll.setWidgetResizable(True)
        viewWidg = QWidget()
        viewVertLayout = QVBoxLayout(viewWidg)
        viewVertLayout.installEventFilter(self)
        viewVertLayout.setAlignment(Qt.AlignTop)
        viewVertLayout.setSpacing(0)
        viewVertLayout.setContentsMargins(3, 3, 3, 3)

        self.files = [QLabel(filename) for filename in self.getDirList()]
        for f in self.files:
            f.installEventFilter(self)
            viewVertLayout.addWidget(f)

        scroll.setWidget(viewWidg)

        mainVertLayout.addWidget(scroll)
        mainVertLayout.setContentsMargins(0, 0, 0, 0)
        mainVertLayout.setSpacing(0)
        mainVertLayout.setAlignment(Qt.AlignLeft)

        self.setCentralWidget(cenWidget)

    def getDirList(self):
        return sorted(os.listdir(self.currentDirectory), 
            key=lambda x : 1 if os.path.isdir(os.path.join(
            self.currentDirectory, x)) and not x.endswith('.BIN') else 2)

    def eventFilter(self, obj, event):
        if event.type() == QEvent.MouseButtonPress:
            # I am interested in this part
            if event.button() == Qt.LeftButton:
                if self.selected and self.files[self.selected] != obj:
                    self.files[self.selected].setProperty('selected', None)
                if obj.property('selected') == None:
                    obj.setProperty('selected', True)
                    self.selected = self.files.index(obj)
                else:
                    obj.setProperty('selected', None)
                    self.selected = None
                obj.setStyleSheet('')

        return QObject.event(obj, event)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MyWindow()
    window.show()
    app.exec_()
下面是style.css文件:

QLabel {
    color: black;
    font-size: 12px;
    background-color: none;
}

QLabel[selected=true] {
    color: #fff;
    background-color: blue;
}
通过再次单击来取消选择之前选中的同一个文件似乎可以正常工作,但不会自动取消选择其他文件I当选择另一个文件时,为什么会这样,以及如何解决此问题? 提前感谢。

您必须调用小部件QStyle的和方法:

def eventFilter(self、obj、event):
如果event.type()==QEvent.MouseButtonPress和self.file中的obj:
如果event.button()==Qt.LeftButton:
如果self.selected为None:
obj.setProperty(“选定”,真)
自我更新样式(obj)
self.selected=obj
elif self.selected为obj:
最后状态=对象属性(“选定”)
obj.setProperty(“选定”,如果最后一个状态为True,则无)
自我更新样式(obj)
self.selected=无
其他:
self.selected.setProperty(“selected”,无)
obj.setProperty(“选定”,真)
自我更新样式(obj)
self.update_样式(self.selected)
self.selected=obj
返回super(MyWindow,self).eventFilter(obj,event)
@静力学方法
def更新_样式(obj):
obj.style().unproish(obj)
obj.style().polish(obj)

我现在试过了,但它似乎不起作用,以前选择的文件/目录仍处于选中状态,第二次单击它取消选择的效果与以前一样。@Zarkos-mmm我不明白你的意思。单击没有蓝色的QLabel时,它将变为蓝色,如果按下蓝色QLabel,则蓝色将被删除。这不是您想要的吗?是的,在我上面的代码中,该部分正在工作,问题是当我尝试选择另一个元素时,以前选择的元素应该自动取消选择,它确实取消了选择(属性“selected”设置为None),但样式没有更改,这就是我的梦想problem@Zarkos您希望一次只选择一个QLabel吗?是的,这正是我想要的,如果我无法正确传达这一点,很抱歉