Как обнаруживать события мыши Qt только над объектами QPainted

Я пытаюсь программно создать виджет компаса, который выглядит примерно так:

Я хочу, чтобы каждый "кусочек" компаса действовал как кнопка для взаимодействия с остальной частью приложения. С этой целью я решил сделать их из QAbstractButtons имела самый логичный смысл и пошла по этому пути:

       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: самостоятельно выполнить геометрические расчеты:

Как я могу добиться этого, не создавая сложной геометрии для проверки положения мыши относительно областей в форме пирога?

Самостоятельно проверить геометрию не так уж и сложно:

  1. Проверьте, находится ли мышь внутри круга, т.е. расстояние между мышью и центром круга <= радиус круга.
  2. Использовать atan2 чтобы вычислить угол и использовать его для определения правильного сегмента

Метод 2: использование QPieSeries

Если вы действительно не хотите выполнять геометрические вычисления самостоятельно, визуализируйте компас с помощью QPieSeries может быть решением, поскольку он обеспечивает hovered функция. Однако получить точное желаемое визуальное представление может быть (труднее).

Другие вопросы по тегам