Как поменять фон виджетов в PyQt5

У меня есть программа и я хочу ей поменять фон.
Искал, нашёл ответы, но не понял. Объясните, пожалуйста, как для чайника.

import os
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QPixmap
from PIL import Image, ImageStat


app = QApplication([])
win = QWidget()
win.resize(700, 500)
win.setWindowTitle("Photoshop")
lb_image = QLabel("")
btn_dir = QPushButton("Folder")
lw_files = QListWidget()

lb_image.setAlignment(Qt.AlignCenter)

Size_text = QLabel("Size image")
btn_left = QPushButton("Flip Left")
btn_right = QPushButton("Flip Right")
btn_flip = QPushButton("Mirror")
btn_sharp = QPushButton("Sharpness")
btn_bw = QPushButton("Reset saturation")

Size_text.setAlignment(Qt.AlignCenter)

row = QHBoxLayout()
col1 = QVBoxLayout()
col2 = QVBoxLayout()
row_tools = QHBoxLayout()

col1.addWidget(btn_dir)
col1.addWidget(lw_files)
col2.addWidget(lb_image)
row_tools.addWidget(Size_text)
row_tools.addWidget(btn_left)
row_tools.addWidget(btn_right)
row_tools.addWidget(btn_flip)
row_tools.addWidget(btn_sharp)
row_tools.addWidget(btn_bw)

col2.addLayout(row_tools)
row.addLayout(col1, 20)
row.addLayout(col2, 80)
win.setLayout(row)

def chooseWorkdir():
    global workdir
    workdir = QFileDialog.getExistingDirectory()

def filter(files, extensions):
    result = []
    for filename in files:
        for ext in extensions:
            if filename.endswith(ext):
                result.append(filename)
    return result

def showFilenamesList():
    extensions = [".jpg", ".JPG", ".jpeg", ".png", ".gif"]
    chooseWorkdir()
    if not not workdir:
        try:
            filenames = filter(os.listdir(workdir), extensions)
            lw_files.clear()
            for filename in filenames:
                lw_files.addItem(filename)
        except Exception as e_:
            print(f'Warning! Error in {e_}')

btn_dir.clicked.connect(showFilenamesList)


class ImageProcessor():
    def init(self):
        self.image = None
        self.dir = None
        self.filename = None
        self.save_dir = "Modified/"

    def loadImage(self, dir, filename):
        self.dir = dir
        self.filename = filename
        image_path = os.path.join(dir, filename)
        self.image = Image.open(image_path)
        (width, height) = self.image.size
        Size_text.setText(f'{width}x{height}')

    def showImage(self, path):
        pixmapimage = QPixmap(path)
        w, h = lb_image.width(), lb_image.height()
        pixmapimage = pixmapimage.scaled(w, h, Qt.KeepAspectRatio)
        lb_image.setPixmap(pixmapimage)
        lb_image.show()


workimage = ImageProcessor()

def showChosenImage():
    if lw_files.currentRow() >= 0:
        filename = lw_files.currentItem().text()
        workimage.loadImage(workdir, filename)
        image_path = os.path.join(workimage.dir, workimage.filename)
        workimage.showImage(image_path)

lw_files.currentRowChanged.connect(showChosenImage)


win.show()
app.exec()

Ответы (1 шт):

Автор решения: S. Nick

Таблицы стилей Qt поддерживают различные свойства, псевдосостояния и подэлементы управления, позволяющие настраивать внешний вид виджетов.

Терминология и синтаксические правила таблиц стилей Qt почти идентичны таковым в HTML CSS.

import os
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPixmap, QImage
#from PIL import Image, ImageStat


class ImageProcessor():
    def __init__(self, parent=None):                                 # +++ parent
        super().__init__()                                           # +++
        self.image = None
        self.dir = None
        self.filename = None
        self.save_dir = "Modified/"
        self.parent = parent                                         # +++ parent

    def loadImage(self, dir, filename):
        self.dir = dir
        self.filename = filename
        image_path = os.path.join(dir, filename)
#        self.image = Image.open(image_path)
#        (width, height) = self.image.size

        self.image = QImage(image_path)                              # +++ QImage   
        width = self.image.width()
        height = self.image.height()        
        self.parent.size_image.setText(f'{width}x{height}')
             
    def showImage(self, path):
        pixmapimage = QPixmap(path)
        w, h = self.parent.lb_image.width(), self.parent.lb_image.height()
        pixmapimage = pixmapimage.scaled(w, h, Qt.KeepAspectRatio)
        self.parent.lb_image.setPixmap(pixmapimage)
        self.parent.lb_image.show()


class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        
        self.setObjectName('mainwindow')                                  # +++ 
        self.workdir = None                                               # +++ 
        
        self.lb_image = QLabel("lb_image")
        self.lb_image.setAlignment(Qt.AlignCenter)
        self.lb_image.setObjectName('lb_image')
        
        self.btn_dir = QPushButton("Folder")
        self.btn_dir.clicked.connect(self.showFilenamesList)
        
        self.lw_files = QListWidget()     
        self.lw_files.currentRowChanged.connect(self.showChosenImage)

        self.size_image = QLabel("Size image")
        self.size_image.setObjectName('size_image')
        self.size_image.setAlignment(Qt.AlignCenter)
        self.btn_left = QPushButton("Flip Left")
        self.btn_right = QPushButton("Flip Right")
        self.btn_flip = QPushButton("Mirror")
        self.btn_sharp = QPushButton("Sharpness")
        self.btn_bw = QPushButton("Reset saturation") 
        
        layout_tools = QHBoxLayout()
        layout_tools.addWidget(self.size_image)
        layout_tools.addWidget(self.btn_left)
        layout_tools.addWidget(self.btn_right)
        layout_tools.addWidget(self.btn_flip)
        layout_tools.addWidget(self.btn_sharp)
        layout_tools.addWidget(self.btn_bw)        
        
        layout_left = QVBoxLayout()           
        layout_left.addWidget(self.btn_dir)
        layout_left.addWidget(self.lw_files)  

        layout_right = QVBoxLayout()            
        layout_right.addWidget(self.lb_image)        
        layout_right.addLayout(layout_tools)        
       
        layout_main = QHBoxLayout(self)          
        layout_main.addLayout(layout_left, 2)
        layout_main.addLayout(layout_right, 8)
        
        self.workimage = ImageProcessor(self)
        
    def showChosenImage(self):
        if self.lw_files.currentRow() >= 0:
            filename = self.lw_files.currentItem().text()
            self.workimage.loadImage(self.workdir, filename)
            image_path = os.path.join(self.workimage.dir, self.workimage.filename)
            self.workimage.showImage(image_path)        

    def filter(self, files, extensions):
        result = []
        for filename in files:
            for ext in extensions:
                if filename.endswith(ext):
                    result.append(filename)
        return result

    def showFilenamesList(self):
        extensions = [".jpg", ".JPG", ".jpeg", ".png", ".gif"]
        workdir = QFileDialog.getExistingDirectory()
        
        if workdir:                                                       # +++ 
#            try:
            filenames = self.filter(os.listdir(workdir), extensions)
            if not filenames:                                             # +++ 
                print(f'Нет файлов: ".jpg", ".JPG", ".jpeg", ".png", ".gif"')
                return
            
            self.workdir = workdir                                        # +++ 
            self.lw_files.clear()
            for filename in filenames:
                self.lw_files.addItem(filename)
#            except Exception as e_:
#                print(f'Warning! Error in {e_}')

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv 
Stylesheet = '''
#mainwindow {
    background-color: #D98C00;                           /* <---- */ 
}

#lb_image, #size_image {
    background-color: rgb(255, 255, 155);                /* <---- */ 
}

/* 
и так далее
*/ 

'''
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    
    app.setStyleSheet(Stylesheet)                                 # !!! +++ 
    
    w = MainWindow()
    w.resize(700, 500)
    w.setWindowTitle("Photoshop")
    w.show()
    sys.exit(app.exec_())

введите сюда описание изображения

введите сюда описание изображения

→ Ссылка