1

円弧に境界線がなく、直線に境界線があるパイの形を描くことはできますか? 以下に写真を添付し​​ました。

現在、これを実装するには、最初に を呼び出しdrawPie()painter.setPen(QtCore.Qt.NoPen)次に を使用QLineFして、パイの形状の中心と角度に基づいて線を個別に描画します。 ここに画像の説明を入力

しかし問題は、角度が 90 の倍数でない場合、線の位置がパイの形と同期しないことです。問題を示す別の写真を添付し​​ます。

ここに画像の説明を入力

これを行うためのシンプルでエレガントな方法はありますか? ありがとう!

4

1 に答える 1

0

カスタム Pie がサブクラス化された QGraphicsRectItem であると仮定すると、次のようなことを試すことができます。

class CustomPie(QtGui.QGraphicsRectItem):

    angle = 2000

    def paint(self, painter, option, widget):

        # Create the path to draw the lines
        path = QtGui.QPainterPath()
        path.moveTo(self.rect().width()/2, self.rect().height()/2)
        path.lineTo(self.rect().width(), self.rect().height()/2)
        path.arcMoveTo(self.rect(), self.angle/16)  # arcMoveTo in degrees
        path.lineTo(self.rect().width()/2, self.rect().height()/2)

        # draw a pie with no Pen
        painter.setPen(QtGui.QPen(QtCore.Qt.NoPen))
        painter.setBrush(QtGui.QBrush(QtCore.Qt.lightGray))
        painter.drawPie(self.rect(), 0, self.angle)

        # Draw the path with a custom Pen
        painter.setPen(QtGui.QPen(QtCore.Qt.black, 2))
        painter.drawPath(path)

ここではpaint、Pie とパスを描画するためにオーバーライドします (実際には独自の方法と非常によく似ています)。__init__同様にオーバーライドする必要があります(クラス属性としての角度はおそらくあなたが望むものではありません)が、それがアイデアです。

于 2013-10-10T08:39:00.790 に答える