0

我正在尝试以编程方式生成一个看起来很像这样的指南针小部件:

指南针小部件目标

我希望指南针的每个“切片”都充当与应用程序其余部分交互的按钮。为此,我认为将它们从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(...)每个对象中创建的饼图区域。

我怎样才能做到这一点,而不必做复杂的几何来检查鼠标位置与饼形区域?

4

1 回答 1

2

方法一:自己进行几何计算:

我怎样才能做到这一点,而不必做复杂的几何来检查鼠标位置与饼形区域?

自己做几何检查并不难:

  1. 检查鼠标是否在圆内,即鼠标与圆心的距离<=圆的半径。
  2. 用于atan2计算角度并用它来确定正确的线段

方法二:使用QPieSeries

如果您真的不想自己实现几何计算,则使用 a 可视化指南针QPieSeries可能是一种解决方案,因为它提供了一个hovered功能。然而,获得准确的所需视觉表示可能(更)困难。

于 2020-11-02T09:59:39.320 回答