Как частично изменить цвет фона виджета?

Рейтинг: 1Ответов: 1Опубликовано: 19.05.2023

Я знаю, как изменять цвет фона виджета полностью, а можно ли как-то менять цвет фона частично?
Например цвет верхней четверти, как на картинке ниже.

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.central_widget = QWidget(self)
        self.setCentralWidget(self.central_widget)
        self.central_widget.setAttribute(Qt.WA_StyledBackground, True)
        self.central_widget.setStyleSheet('background-color: yellow')
        self.layout_main_window = QVBoxLayout()
        self.central_widget.setLayout(self.layout_main_window)

        self.layout_main_window.addWidget(QLabel('Строка 1'))
        self.layout_main_window.addWidget(QLabel('Строка 2'))
        self.layout_main_window.addWidget(QLabel('Строка 3'))
        self.layout_main_window.addWidget(QLabel('Строка 4'))


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec_())

Сейчас так:

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


А нужно примерно вот так:

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


UPD: Речь именно о виджетах, а не об окне в целом, в окне таких цветных квадратиков может быть несколько и мне каждый из них нужно покрасить в два цвета:

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

Ответы

▲ 1Принят

Я не уверен, что правильно понимаю то, что вы хотите делать. Но попробуйте так:

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        
        self.central_widget = QWidget(self)
        self.setCentralWidget(self.central_widget)
        
        self.central_widget.setAttribute(Qt.WA_StyledBackground, True)
        self.central_widget.setStyleSheet('background-color: yellow')

        self.label = QLabel()                                                # +++
        self.label.setStyleSheet('background-color: green')                  # +++

        self.layout_main_window = QVBoxLayout()
        self.central_widget.setLayout(self.layout_main_window)
        self.layout_main_window.setContentsMargins(0, 0, 0, 0)

        self.layout_main_window.addWidget(self.label, alignment=Qt.AlignTop) # +++
        
        self.layout_main_window.addWidget(QLabel('Строка 1'))
        self.layout_main_window.addWidget(QLabel('Строка 2'))
        self.layout_main_window.addWidget(QLabel('Строка 3'))
        self.layout_main_window.addWidget(QLabel('Строка 4'))


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec_())

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



Update:

довольно хорошее и простое решение, но тогда теряется одна строчка полезного места, занятого новой QLabel.
А хотелось бы, чтобы именно часть виджета, которая была желтого цвета, становилась зеленой, пусть даже надпись "Строка 1" теперь будет на зеленом фоне

Попробуйте так:

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        
        self.central_widget = QWidget(self)
        self.setCentralWidget(self.central_widget)
        
        self.central_widget.setAttribute(Qt.WA_StyledBackground, True)
        self.central_widget.setStyleSheet('background-color: yellow')

        self.layout_main_window = QVBoxLayout()
        self.central_widget.setLayout(self.layout_main_window)
        self.layout_main_window.setContentsMargins(0, 0, 0, 0)

        self.label_1 = QLabel('\n\nСтрока 1')
        self.label_1.setStyleSheet("""
            background: qlineargradient(
                spread:pad, 
                x1:0.22, y1:0.5, 
                x2:0.22, y2:0, 
                stop:0 rgba(255, 255, 0, 255), 
                stop:1 rgba(255, 0, 0, 255));
        """)
        
        self.layout_main_window.addWidget(self.label_1, 1)
        self.layout_main_window.addWidget(QLabel('Строка 2'), 1)
        self.layout_main_window.addWidget(QLabel('Строка 3'), 1)
        self.layout_main_window.addWidget(QLabel('Строка 4'), 1)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec_())

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