Изменение цвета QPushButton через обработчик событий MouseEvent

Поскольку столкнулся с отсутствием необходимых мне возможностей в QSS, пытаюсь с помощью обработчика событий и QPainter перекрасить кнопку как мне нужно.

Необходимо чтобы при состоянии :hover и :pressed кнопка меняла изображение на то, что указано в переопределённом классе кнопки.

Если с работой класса QMauseEvent я немного разобрался, то вот как соединить его с QPainter я понять не могу.

Подскажите пожалуйста, как это возможно сделать?

main.py

import sys
from PyQt5.QtWidgets import *
from painter import *


class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__()
        self.initUI()

    def mousePressEvent(self, event):
        event = QMouseEvent(QEvent.MouseButtonPress,event.pos(),Qt.LeftButton, Qt.LeftButton, Qt.NoModifier )

    def initUI(self):
        centralwidget = QWidget(self)
        self.setCentralWidget(centralwidget)
        main_box = QGridLayout(centralwidget)

        consumption_btn = PushButton_tb()
        main_box.addWidget(consumption_btn)

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

painter.py

class PushButton_tb(QPushButton):
    def __init__(self, *args, **kwargs):
        super(PushButton_tb, self).__init__(*args, **kwargs)

    def paintEvent(self, event):
        QPushButton.setMouseTracking(self, True)
        QPushButton.paintEvent(self, event)
        painter = QPainter(self)
        painter.setRenderHint(QPainter.Antialiasing)
        painter.drawPixmap(self.rect(), QPixmap("resources/images/assets/btn_bg/btn_text60_purple_0.png"))
        painter.setPen(QColor("#fff4d7"))
        painter.setFont(QFont("Heuristica", 10))
        painter.drawText(self.rect(), Qt.AlignCenter, "Consumption \n calculator")

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

Автор решения: Виктор

А если так:

consumption_btn.setStyleSheet("QPushButton { background-color: blue }"
          "QPushButton:pressed { background-color: red }" )
→ Ссылка
Автор решения: S. Nick

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

import sys
from PyQt5.Qt import *


class PicButton(QAbstractButton):
    def __init__(self, pixmap, pixmap_hover, pixmap_pressed, parent=None):
        super(PicButton, self).__init__(parent)
        
        self.setFixedSize(150, 150)

        self.pixmap = pixmap
        self.pixmap_hover = pixmap_hover
        self.pixmap_pressed = pixmap_pressed
        self.setCheckable(True)                                      

    def paintEvent(self, event):
        pix = self.pixmap_hover if self.underMouse() else self.pixmap
        text = 'Наведено' if self.underMouse() else 'Выключено'
        if self.isChecked():                                          
            pix = self.pixmap_pressed
            text = 'Наведено' if self.underMouse() else 'Включено' 
            
        painter = QPainter(self)
        painter.drawPixmap(event.rect(), pix.scaled(150, 150))
        painter.setPen(QColor("#fff"))
        painter.setFont(QFont("Heuristica", 11))
        painter.drawText(self.rect(), Qt.AlignCenter, text)

    def enterEvent(self, event):
        self.update()

    def leaveEvent(self, event):
        self.update()

    def sizeHint(self):
        return QSize(150, 150)     
        

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        centralwidget = QWidget(self)
        self.setCentralWidget(centralwidget)
        main_box = QGridLayout(centralwidget)

        self.consumption_btn = PicButton(
            QPixmap('images/Red.png'),
            QPixmap('images/Yellow.png'),
            QPixmap('images/Green.png')
        )
        self.consumption_btn.setText("rec")
        self.consumption_btn.clicked.connect(self.controlButtons)

        main_box.addWidget(self.consumption_btn)

    def controlButtons(self):
        pass


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MainWindow()
    w.resize(250, 250)
    w.show()
    sys.exit(app.exec_()) 

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

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

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

→ Ссылка