我有一个场景,我想用QPainterpath在两点之间画一条线(鼠标按下应该是起点,鼠标释放应该是终点)
这是我想要的一个演示
下面是我当前代码的情况
下面是我尝试过的代码
import sys
from PyQt5 import QtWidgets, QtCore, QtGui
class Scene(QtWidgets.QGraphicsScene):
def __init__(self, *args, **kwargs):
super(Scene, self).__init__(*args, **kwargs)
self.point = QtCore.QPointF(0.0, 0.0)
self.path = QtGui.QPainterPath()
self.start_point = None
self.end_point = None
self.start = False
def mousePressEvent(self, event):
self.start_point = event.scenePos()
self.start = True
self.path = QtGui.QPainterPath(self.start_point)
# self.addLine(self.line.setP1(self.start_point))
super().mousePressEvent(event)
def mouseMoveEvent(self, event):
if self.start:
self.path.lineTo(event.scenePos())
# self.path.moveTo(event.scenePos())
self.addPath(self.path, QtGui.QPen(QtCore.Qt.red))
super(Scene, self).mouseMoveEvent(event)
def mouseReleaseEvent(self, event):
if self.start:
print(self.path)
self.path.lineTo(event.scenePos())
# self.path.moveTo(event.scenePos())
self.addPath(self.path, QtGui.QPen(QtCore.Qt.red))
self.start = False
super(Scene, self).mouseReleaseEvent(event)
def main():
app = QtWidgets.QApplication(sys.argv)
view = QtWidgets.QGraphicsView()
view.setRenderHint(QtGui.QPainter.Antialiasing)
view.setMouseTracking(True)
scene = Scene()
view.setScene(scene)
view.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
任何试图使用
QLineF
和QGraphicsLineItem
实现此目的的人都可以使用Thx到@eyllansc 这是代码每次使用lineTo时,都会创建一条新线,其中起点是最后添加的点,终点是传递给函数的点,因此可以看到曲线,因为它们是这些线的并集。解决方案是使用两个变量存储起点和终点,并在必要时进行更新,然后使用该信息更新QGraphicsPathItem,而不是QPainterPath。同样的概念也适用于QLineF的QGraphicsLineItem
相关问题 更多 >
编程相关推荐