Изменение цвета у объектов 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())