Как поменять фон виджетов в 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_())

