Как обнаруживать события мыши Qt только над объектами QPainted
Я пытаюсь программно создать виджет компаса, который выглядит примерно так:
Я хочу, чтобы каждый "кусочек" компаса действовал как кнопка для взаимодействия с остальной частью приложения. С этой целью я решил сделать их из
QAbstractButton
s имела самый логичный смысл и пошла по этому пути:
class compassWedge(QAbstractButton):
def __init__(self, start_angle, parent=None):
super().__init__(parent)
self.start = start_angle
self.setFixedSize(550, 550)
self.setMouseTracking(True)
def paintEvent(self, event):
painter = QPainter(self)
painter.setRenderHint(QPainter.Antialiasing)
brush = QBrush()
if self.underMouse():
brush.setColor(Qt.black)
else:
brush.setColor(Qt.white)
pen = QPen(Qt.black)
pen.setWidth(5)
painter.setBrush(brush)
painter.setPen(pen)
painter.drawPie(25, 25, 500, 500, self.start, 45 * 16)
painter.end()
class compassApplet(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.setFixedSize(550, 550)
self.wedges = []
for start in range(0, 360 * 16, 45 * 16):
self.wedges.append(compassWedge(start, self))
И визуально это пока работает отлично:
Проблема в том, что
underMouse()
учитывается вся область виджета фрагмента 550x550. Вместо этого я хочу определять, когда мышь находится внутри пикселей, сгенерированных в
paintEvent
для каждого фрагмента, то есть области круговой диаграммы, созданной
painter.drawPie(...)
в каждом объекте.
Как я могу добиться этого, не прибегая к сложной геометрии для проверки положения мыши относительно областей в форме пирога?
1 ответ
Метод 1: самостоятельно выполнить геометрические расчеты:
Как я могу добиться этого, не создавая сложной геометрии для проверки положения мыши относительно областей в форме пирога?
Самостоятельно проверить геометрию не так уж и сложно:
- Проверьте, находится ли мышь внутри круга, т.е. расстояние между мышью и центром круга <= радиус круга.
- Использовать
atan2
чтобы вычислить угол и использовать его для определения правильного сегмента
Метод 2: использование
QPieSeries
Если вы действительно не хотите выполнять геометрические вычисления самостоятельно, визуализируйте компас с помощью
QPieSeries
может быть решением, поскольку он обеспечивает hovered
функция. Однако получить точное желаемое визуальное представление может быть (труднее).