在鼠标的按下的事件设置一条QLineF 并设置起始坐标和结束坐标, 鼠标移动事件也设置一条QLineF设置起始坐标和结束坐标并计算两线段之间夹角
时间: 2024-02-01 13:16:53 浏览: 156
以下是一个示例代码,实现了在鼠标按下和移动时创建并更新一条线段,并计算两条线段之间的夹角:
```python
from PyQt5.QtCore import Qt, QPointF, QLineF, QPointF
from PyQt5.QtGui import QPainter, QPen
from PyQt5.QtWidgets import QApplication, QGraphicsScene, QGraphicsView, QGraphicsLineItem, QMainWindow
class MyView(QGraphicsView):
def __init__(self):
super().__init__()
self.scene = QGraphicsScene(self)
self.setScene(self.scene)
self.line1 = None
self.line2 = None
self.angle = None
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self.line1 = QLineF(event.scenePos(), event.scenePos())
self.line2 = None
self.angle = None
def mouseMoveEvent(self, event):
if self.line1 is not None:
self.line2 = QLineF(self.line1.p1(), event.scenePos())
if self.angle is not None:
self.angle = self.line1.angleTo(self.line2)
self.update()
def mouseReleaseEvent(self, event):
if event.button() == Qt.LeftButton:
if self.line2 is not None:
self.angle = self.line1.angleTo(self.line2)
self.scene.addItem(QGraphicsLineItem(self.line2))
self.line1 = None
self.line2 = None
self.update()
def paintEvent(self, event):
super().paintEvent(event)
if self.line1 is not None:
pen = QPen(Qt.red, 2, Qt.SolidLine, Qt.RoundCap)
self.scene.addLine(self.line1, pen)
if self.line2 is not None:
pen = QPen(Qt.green, 2, Qt.SolidLine, Qt.RoundCap)
self.scene.addLine(self.line2, pen)
if self.angle is not None:
painter = QPainter(self.viewport())
painter.setPen(QPen(Qt.black))
painter.drawText(QPointF(10, 20), "Angle: {:.2f}".format(self.angle))
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.view = MyView()
self.setCentralWidget(self.view)
if __name__ == '__main__':
app = QApplication([])
window = MainWindow()
window.show()
app.exec_()
```
在这个示例代码中,我们创建了一个自定义的 QGraphicsView 类,其中实现了三个鼠标事件:
- mousePressEvent:在左键按下时创建一条新的线段 line1,并将其起始点和结束点设置为当前鼠标位置。
- mouseMoveEvent:在左键按下并移动时,更新 line1 的结束点为当前鼠标位置,并创建一条新的线段 line2,将其起始点设置为 line1 的起始点,结束点设置为当前鼠标位置。同时计算 line1 和 line2 之间的夹角,并存储在 angle 变量中。
- mouseReleaseEvent:在左键释放时,如果当前存在 line2,则将其添加到场景中。同时清空 line1、line2 和 angle 变量。
在 paintEvent 方法中,我们根据当前的 line1、line2 和 angle 变量,分别在场景中绘制红色的 line1、绿色的 line2 和黑色的 angle 文本。由于我们只需要在视图中绘制这些元素,因此使用 viewport() 方法获取视图的绘制区域。
需要注意的是,在鼠标移动时计算夹角时,我们需要使用 QLineF 的 angleTo 方法,该方法可以计算两条线段之间的夹角。
阅读全文