我正在尝试使用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_())
你需要capStyle
使用适当的设置笔的Qt.PenCapStyle
,在这种情况下,你应该使用FlatCap
,它恰好在行的结尾处结束,而默认值是SquareCap
(它覆盖了行尾并延伸了行宽的一半):
painter.setPen(QPen(Qt.green, arcwidth, cap=Qt.FlatCap))
杰出的 !!!效果很好,坦赞了!!我查看了setPen,但请注意PenStyle ...:-/