Python 使用QPainterPath在两点之间绘制直线

Python 使用QPainterPath在两点之间绘制直线,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,我有一个场景,我想用QPainterpath在两点之间画一条线(鼠标按下应该是起点,鼠标释放应该是终点) 这是我想要的一个演示 下面是我当前代码的情况 下面是我尝试过的代码 导入系统 从PyQt5导入QtWidgets、QtCore、QtGui 类场景(qtwidts.qgraphicscene): 定义初始化(self,*args,**kwargs): 超级(场景,自我)。\uuuuuuuuuuuuuuuuuuu初始(*args,**kwargs) self.point=QtCore.QP

我有一个场景,我想用QPainterpath在两点之间画一条线(鼠标按下应该是起点,鼠标释放应该是终点)

这是我想要的一个演示

下面是我当前代码的情况

下面是我尝试过的代码

导入系统 从PyQt5导入QtWidgets、QtCore、QtGui 类场景(qtwidts.qgraphicscene): 定义初始化(self,*args,**kwargs): 超级(场景,自我)。\uuuuuuuuuuuuuuuuuuu初始(*args,**kwargs) self.point=QtCore.QPointF(0.0,0.0) self.path=QtGui.QPainterPath() self.start\u point=无 self.end_point=无 self.start=False def鼠标压力事件(自身、事件): self.start\u point=event.scenePos() self.start=True self.path=QtGui.QPainterPath(self.start\u点) #self.addLine(self.line.setP1(self.start_点)) super().mousePressEvent(事件) def mouseMoveEvent(自身、事件): 如果自启动: self.path.lineTo(event.scenePos()) #self.path.moveTo(event.scenePos()) self.addPath(self.path,QtGui.QPen(QtCore.Qt.red)) 超级(场景,自我)。mouseMoveEvent(事件) def mouseReleaseEvent(自身,事件): 如果自启动: 打印(self.path) self.path.lineTo(event.scenePos()) #self.path.moveTo(event.scenePos()) self.addPath(self.path,QtGui.QPen(QtCore.Qt.red)) self.start=False 超级(场景,自我)。mouseReleaseEvent(事件) def main(): app=qtwidts.QApplication(sys.argv) view=QtWidgets.QGraphicsView() view.setRenderInt(QtGui.qPaint.Antialiasing) view.setMouseTracking(真) 场景=场景() view.setScene(场景) view.show() sys.exit(app.exec_()) 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': main()
每次使用lineTo时,都会创建一条新线,其中起点是最后添加的点,终点是传递给函数的点,因此可以看到曲线,因为它们是这些线的并集。解决方案是使用两个变量存储起点和终点,并在必要时进行更新,然后使用该信息更新QGraphicsPathItem,而不是QPainterPath。同样的概念也适用于QLineF的QGraphicsLineItem

类场景(qtwidts.qgraphicscene):
定义初始化(self,*args,**kwargs):
超级(场景,自我)。\uuuuuuuuuuuuuuuuuuu初始(*args,**kwargs)
self.path_item=self.addPath(QtGui.QPainterPath())
self.start_point=QtCore.QPointF()
self.end_point=QtCore.QPointF()
def鼠标压力事件(自身、事件):
self.start\u point=event.scenePos()
self.end\u point=self.start\u point
self.update_path()
super().mousePressEvent(事件)
def mouseMoveEvent(自身、事件):
如果event.buttons()&QtCore.Qt.LeftButton:
self.end_point=event.scenePos()
self.update_path()
超级(场景,自我)。mouseMoveEvent(事件)
def mouseReleaseEvent(自身,事件):
self.end_point=event.scenePos()
self.update_path()
超级(场景,自我)。mouseReleaseEvent(事件)
def更新路径(自身):
如果不是self.start\u point.isNull()而不是self.end\u point.isNull():
path=QtGui.QPainterPath()
path.moveTo(self.start_点)
path.lineTo(自身端点)
self.path\u item.setPath(路径)

每次使用lineTo时,都会创建一条新线,其中起点是最后添加的点,终点是传递给函数的点,因此可以看到曲线,因为它们是这些线的并集。解决方案是使用两个变量存储起点和终点,并在必要时进行更新,然后使用该信息更新QGraphicsPathItem,而不是QPainterPath。同样的概念也适用于QLineF的QGraphicsLineItem

类场景(qtwidts.qgraphicscene):
定义初始化(self,*args,**kwargs):
超级(场景,自我)。\uuuuuuuuuuuuuuuuuuu初始(*args,**kwargs)
self.path_item=self.addPath(QtGui.QPainterPath())
self.start_point=QtCore.QPointF()
self.end_point=QtCore.QPointF()
def鼠标压力事件(自身、事件):
self.start\u point=event.scenePos()
self.end\u point=self.start\u point
self.update_path()
super().mousePressEvent(事件)
def mouseMoveEvent(自身、事件):
如果event.buttons()&QtCore.Qt.LeftButton:
self.end_point=event.scenePos()
self.update_path()
超级(场景,自我)。mouseMoveEvent(事件)
def mouseReleaseEvent(自身,事件):
self.end_point=event.scenePos()
self.update_path()
超级(场景,自我)。mouseReleaseEvent(事件)
def更新路径(自身):
如果不是self.start\u point.isNull()而不是self.end\u point.isNull():
path=QtGui.QPainterPath()
path.moveTo(self.start_点)
path.lineTo(自身端点)
self.path\u item.setPath(路径)

任何试图使用
QLineF
QGraphicsLineItem
这是代码

导入系统 从PyQt5导入QtWidgets、QtCore、QtGui 类场景(qtwidts.qgraphicscene): 定义初始化(self,*args,**kwargs): 超级(场景,自我)。\uuuuuuuuuuuuuuuuuuu初始(*args,**kwargs) 自我设置设置(QtCore.QRectF(0,0,500,500)) self.line=None self.graphics\u line=无 self.start_point=QtCore.QPointF() self.end_point=QtCore.QPointF() def鼠标压力事件(自身、事件): self.start\u point=event.scenePos() self.end\u point=self.start\u point self.line=QtCore.QLineF(self.start\u点、self.end\u点) self.graphics\u line=qtwidts.QGraphicsLineItem(self.line) self.update_path() s