Warm tip: This article is reproduced from serverfault.com, please click

python-带有宽“笔”的PyQt5 drawArc

(python - PyQt5 drawArc with wide "pen")

发布于 2020-11-28 18:33:47

我正在尝试使用PyQt5绘制圆规(MacOS 11.0.1,Python 3.9)。我使用drawArc语句创建了量规背景,因此我将笔的宽度设置为较大的值(70)。产生的弧看起来像马蹄形,大概是因为“笔”是70像素的正方形,而不是垂直于行进方向的线。

有没有一种在PyQt5中创建圆弧的方法,就像图片右侧的圆弧一样?

我愿意接受建议:该应用程序已经使用Python + Tkinter编写,但是由于Tkinter + Raspberry上缺少抗锯齿功能,因此我需要重新编写它。

(计划B将继续使用PyQt,创建一个饼图切片(drawPie),并用背景颜色的圆覆盖中心区域-但这并不理想,因为这对我的设计施加了一些限制。)

# importing libraries
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys

arcreading = 0
adder = .1
# creating a Gauge class
class Gauge(QMainWindow):

    # constructor
    def __init__(self):
        super().__init__()

        timer = QTimer(self)                 # create a timer object
        timer.timeout.connect(self.update)   # add action to the timer, update the whole code
        timer.start(0)                    # update cycle in milliseconds

        self.setGeometry(200, 200, 600, 600)       # window location and size
        self.setStyleSheet("background : black;")  # background color

    # -----------------------
    # method for paint event
    # -----------------------
    def paintEvent(self, event):
        global arcreading
        global adder
        # print('x')
        kanvasx = 50        # binding box origin: x
        kanvasy = 50        # binding box origin: y
        kanvasheight = 150  # binding box height
        kanvaswidth = 150   # binding box width
        arcsize = 270       # arc angle between start and end.
        arcwidth = 70       # arc width


        painter = QPainter(self)    # create a painter object
        painter.setRenderHint(QPainter.Antialiasing)  # tune up painter
        painter.setPen(QPen(Qt.green, arcwidth))      # set color and width

        # ---------- the following lines simulate sensor reading. -----------
        if arcreading > arcsize or arcreading < 0:  # variable to make arc move
            adder = -adder  # arcreading corresponds to the
            # value to be indicated by the arc.
        arcreading = arcreading + adder
        # --------------------- end simulation ------------------------------
        #print(arcreading)

        # drawArc syntax:
        #       drawArc(x_axis, y_axis, width, length, startAngle, spanAngle)
        painter.drawArc(kanvasx, kanvasy,   # binding box: x0, y0, pixels
                   kanvasheight + arcwidth, # binding box: height
                   kanvaswidth + arcwidth,  # binding box: width
                   int((arcsize + (180 - arcsize) / 2)*16),  # arc start point, degrees (?)
                   int(-arcreading*16))         # arc span

        painter.end()                       # end painter

    # Driver code
if __name__ == '__main__':
    app = QApplication(sys.argv)
    # creating a Gauge object
    win = Gauge()
    # show
    win.show()
    exit(app.exec_())

在此处输入图片说明

Questioner
nandomtl
Viewed
11
musicamante 2020-11-29 03:14:40

你需要capStyle使用适当的设置笔的Qt.PenCapStyle,在这种情况下,你应该使用FlatCap,它恰好在行的结尾处结束,而默认值是SquareCap(它覆盖了行尾并延伸了行宽的一半):

painter.setPen(QPen(Qt.green, arcwidth, cap=Qt.FlatCap))