Изменение цвета 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_())


