Изменение цвета у объектов QPainter

Есть несколько кругов (кнопок), нарисованных в QPainter.
Нужна возможность менять цвет любой из них по отдельности.

В данном игрушечном варианте - смена цвета вызывается нажатием соответствующей горячей клавиши.

import sys
from PySide6.QtWidgets import *
from PySide6.QtCore import *
from PySide6.QtGui import *


class Main(QWidget):
    def __init__(self, parent=None):
        super(Main, self).__init__(parent)
        self.state_button_1 = 0
        self.state_button_2 = 0
        self.state_button_3 = 0

def paintEvent(self, event):
    painter = QPainter(self)
    painter.setRenderHint(QPainter.Antialiasing, True)
    painter.setPen(QPen(Qt.black, 2, Qt.SolidLine))
    painter.setBrush(QBrush(Qt.red, Qt.SolidPattern))
    painter.drawEllipse(50, 50, 20, 20)
    painter.drawEllipse(30, 70, 20, 20)
    painter.drawEllipse(70, 70, 20, 20)

def keyPressEvent(self, keyEvent):
    key = keyEvent.key()
    if key == Qt.Key_Q:
        if self.state_button_1:
            # меняем цвет кнопки  (50, 50) на зелёный
            self.state_button_1 = 0
            print('кнопка 1 зелёная')
        else:
            # меняем цвет кнопки  (50, 50) на красный
            self.state_button_1 = 1
            print('кнопка 1 красная')
    elif key == Qt.Key_W:
        if self.state_button_2:
            # меняем цвет кнопки  (30,70) на зелёный
            self.state_button_2 = 0
            print('кнопка 2 зелёная')
        else:
            # меняем цвет кнопки  (30,70) на красный
            self.state_button_2 = 1
            print('кнопка 2 красная')
    elif key == Qt.Key_E:  
        if self.state_button_3:
            # меняем цвет кнопки  (70, 70) на зелёный
            self.state_button_3 = 0
            print('кнопка 3 зелёная')
        else:
            # меняем цвет кнопки  (70, 70) на красный
            self.state_button_3 = 1
            print('кнопка 3 красная')


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = Main()
    w.show()
    sys.exit(app.exec())

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

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

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

import sys
'''
from PySide6.QtWidgets import *
from PySide6.QtCore import *
from PySide6.QtGui import *
'''
from PyQt5.Qt import *


class Main(QWidget):
    def __init__(self, parent=None):
        super(Main, self).__init__(parent)
        
        self.button_1 = QPushButton(self)
        self.button_1.move(50, 50)
        self.button_1.setCheckable(True)
        self.button_2 = QPushButton(self)
        self.button_2.move(30, 70)
        self.button_2.setCheckable(True)
        self.button_3 = QPushButton(self)
        self.button_3.move(70, 70)
        self.button_3.setCheckable(True)

    def keyPressEvent(self, keyEvent):
        key = keyEvent.key()
        if key == Qt.Key_Q:
            self.button_1.click()
        elif key == Qt.Key_W:
            self.button_2.click()
        elif key == Qt.Key_E:  
            self.button_3.click()


StyleSheet = '''
QPushButton {
    min-width:  17px;
    max-width:  17px;
    min-height: 17px;
    max-height: 17px;
    border: 2px solid #191970;
    border-radius: 10px;        
    background-color: #FF0000;     
}    
QPushButton:hover {
    background-color: #f55; 
} 
QPushButton:checked {
    background-color: #00FF7F; 
} 
QPushButton:checked:hover {
    background-color: #77FF33; 
}    
'''


if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setStyleSheet(StyleSheet)
    w = Main()
    w.show()
    sys.exit(app.exec())

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



Update

К сожалению нет, шарики надо именно рисовать.
Надо было мне привести код, приближённый к реальному, а не совсем игрушечный.

Объекты, созданные в методе paintEvent() - painter.drawEllipse(), painter.drawRect - можно ли получить к ним доступ как к отдельным виджетам?

Я не совсем понимаю вашу реализацию, ну, надо - так надо.

import sys
from PyQt5.Qt import *


class Main(QWidget):
    def __init__(self, parent=None):
        super(Main, self).__init__(parent)
        
        self.state_button_1 = 0
        self.state_button_2 = 0
        self.state_button_3 = 0
        
        self.color_red = "#FF0000"                                   # +++
        self.color_green = "#00FF7F"                                 # +++

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.setRenderHint(QPainter.Antialiasing, True)
        painter.setPen(QPen(Qt.black, 2, Qt.SolidLine))
        
#        painter.setBrush(QBrush(Qt.red, Qt.SolidPattern))
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv       
        if self.state_button_1:
            painter.setBrush(QBrush(QColor(self.color_green)))
        else:
            painter.setBrush(QBrush(QColor(self.color_red)))        
        painter.drawEllipse(50, 50, 20, 20)
        if self.state_button_2:
            painter.setBrush(QBrush(QColor(self.color_green)))
        else:
            painter.setBrush(QBrush(QColor(self.color_red)))         
        painter.drawEllipse(30, 70, 20, 20)
        if self.state_button_3:
            painter.setBrush(QBrush(QColor(self.color_green)))
        else:
            painter.setBrush(QBrush(QColor(self.color_red))) 
        painter.drawEllipse(70, 70, 20, 20)
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    def keyPressEvent(self, keyEvent):
        key = keyEvent.key()
        if key == Qt.Key_Q:
            if self.state_button_1:
                # меняем цвет кнопки  (50, 50) на зелёный
                self.state_button_1 = 0
                print('кнопка 1 красная')
            else:
                # меняем цвет кнопки  (50, 50) на красный
                self.state_button_1 = 1
                print('кнопка 1 зелёная')
            self.update()                                            # +++
        elif key == Qt.Key_W:
            if self.state_button_2:
                # меняем цвет кнопки  (30,70) на зелёный
                self.state_button_2 = 0
                print('кнопка 2 красная')
            else:
                # меняем цвет кнопки  (30,70) на красный
                self.state_button_2 = 1
                print('кнопка 2 зелёная')
            self.update()                                            # +++
        elif key == Qt.Key_E:  
            if self.state_button_3:
                # меняем цвет кнопки  (70, 70) на зелёный
                self.state_button_3 = 0
                print('кнопка 3 красная')
            else:
                # меняем цвет кнопки  (70, 70) на красный
                self.state_button_3 = 1
                print('кнопка 3 зелёная')
            self.update()                                            # +++


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = Main()
    w.show()
    sys.exit(app.exec()) 

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

→ Ссылка