矩形
from PyQt5.QtCore import Qt, QRect
from PyQt5.QtGui import QPainter, QPen
from PyQt5.QtWidgets import QWidget, QApplication
class DrawRect(QWidget):
def __init__(self, parent=None):
super(DrawRect, self).__init__(parent)
self.resize(600, 400)
self.start_point = None
self.end_point = None
self.start = False
self.drawing = False
self.setCursor(Qt.CrossCursor)
self.setMouseTracking(True)
def paintEvent(self, event):
super(DrawRect, self).paintEvent(event)
if self.drawing:
painter = QPainter()
painter.begin(self)
pen = QPen(Qt.red, 5)
painter.setPen(pen)
painter.drawRect(QRect(self.start_point, self.end_point))
painter.end()
def mousePressEvent(self, event):
if not self.start:
self.start_point = event.pos()
self.start = True
def mouseReleaseEvent(self, event):
if self.drawing:
self.drawing = False
self.start = False
def mouseMoveEvent(self, event):
if self.start:
self.end_point = event.pos()
self.drawing = True
self.update()
if __name__ == '__main__':
app = QApplication([])
demo = DrawRect()
demo.show()
app.exec_()
圆
import math
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPainter, QPen
from PyQt5.QtWidgets import QWidget, QApplication
class DrawRect(QWidget):
def __init__(self, parent=None):
super(DrawRect, self).__init__(parent)
self.resize(600, 400)
self.start_point = None
self.end_point = None
self.start = False
self.drawing = False
self.radius = 0
self.setCursor(Qt.CrossCursor)
self.setMouseTracking(True)
def paintEvent(self, event):
super(DrawRect, self).paintEvent(event)
if self.drawing:
painter = QPainter()
painter.begin(self)
pen = QPen(Qt.red, 5)
painter.setPen(pen)
painter.drawEllipse(self.start_point, self.radius, self.radius)
painter.end()
def mousePressEvent(self, event):
if not self.start:
self.start_point = event.pos()
self.start = True
def mouseReleaseEvent(self, event):
if self.drawing:
self.drawing = False
self.start = False
def mouseMoveEvent(self, event):
if self.start:
self.end_point = event.pos()
self.radius = self.calc_radius()
self.drawing = True
self.update()
def calc_radius(self):
return math.sqrt(
(self.start_point.x() - self.end_point.x()) ** 2 + (self.start_point.y() - self.end_point.y()) ** 2)
if __name__ == '__main__':
app = QApplication([])
demo = DrawRect()
demo.show()
app.exec_()
斜矩形
from PyQt5.QtCore import Qt, QPointF, QLineF
from PyQt5.QtGui import QPainter, QPen, QPolygonF
from PyQt5.QtWidgets import QWidget, QApplication
class DrawRect(QWidget):
def __init__(self, parent=None):
super(DrawRect, self).__init__(parent)
self.resize(600, 400)
self.point1 = None
self.point2 = None
self.cursor_point = None
self.point_count = 0
self.line = None
self.polygon = None
self.end = False
self.is_line = False
self.is_polygon = False
self.setCursor(Qt.CrossCursor)
self.setMouseTracking(True)
def paintEvent(self, event):
super(DrawRect, self).paintEvent(event)
if self.is_polygon and self.polygon:
painter = QPainter()
painter.begin(self)
pen = QPen(Qt.red, 5)
painter.setPen(pen)
painter.drawPolygon(self.polygon)
painter.end()
elif self.is_line and self.line:
painter = QPainter()
painter.begin(self)
pen = QPen(Qt.red, 5)
painter.setPen(pen)
painter.drawLine(self.line)
painter.end()
def mousePressEvent(self, event):
if self.point_count == 0:
self.point1 = event.pos()
self.point_count = 1
elif self.point_count == 1:
self.point2 = event.pos()
self.point_count = 2
def mouseReleaseEvent(self, event):
if self.end:
self.end = False
self.point_count = 0
def mouseMoveEvent(self, event):
if self.point_count == 1:
self.is_line = True
self.is_polygon = False
self.point2 = event.pos()
self.calc_line()
if self.point_count == 2:
self.cursor_point = event.pos()
self.calc_polygon()
self.end = True
self.is_line = False
self.is_polygon = True
self.update()
def calc_line(self):
self.line = QLineF(self.point1, self.point2)
def calc_polygon(self):
point_list = [self.point1, self.point2]
x1 = self.point1.x()
y1 = self.point1.y()
x2 = self.point2.x()
y2 = self.point2.y()
x3 = self.cursor_point.x()
y3 = (x2 ** 2 - 2 * x1 * x2 + y2 ** 2 - 2 * y1 * y2 + y2 ** 2 + x2 ** 2 - 2 * x2 * x3 + 2 * x1 * x3) / (
2 * y2 - 2 * y1)
dx = x2 - x3
dy = y2 - y3
if abs(dx) < 0.00000001 and abs(dy) < 0.00000001:
return
u = (self.cursor_point.x() - x2) * (x2 - x3) + (self.cursor_point.y() - y2) * (y2 - y3)
u = u / ((dx * dx) + (dy * dy))
x3 = x2 + u * dx
y3 = y2 + u * dy
point3 = QPointF(x3, y3)
point_list.append(point3)
x4 = x1 + x3 - x2
y4 = y1 + y3 - y2
point4 = QPointF(x4, y4)
point_list.append(point4)
self.polygon = QPolygonF(point_list)
if __name__ == '__main__':
app = QApplication([])
demo = DrawRect()
demo.show()
app.exec_()
多边形
from PyQt5.QtCore import Qt, QLineF
from PyQt5.QtGui import QPainter, QPen, QPolygonF
from PyQt5.QtWidgets import QWidget, QApplication
class DrawPolygon(QWidget):
def __init__(self, parent=None):
super(DrawPolygon, self).__init__(parent)
self.resize(600, 400)
self.setCursor(Qt.CrossCursor)
self.setMouseTracking(True)
self.line_list = []
self.point_list = []
self.cursor_point = None
self.end_point = None
def paintEvent(self, event):
super(DrawPolygon, self).paintEvent(event)
if not self.point_list:
return
if self.end_point:
painter = QPainter()
painter.begin(self)
pen = QPen(Qt.red, 5)
painter.setPen(pen)
polygon = QPolygonF(self.point_list)
painter.drawPolygon(polygon)
painter.end()
return
if len(self.point_list) == 1:
painter = QPainter()
painter.begin(self)
pen = QPen(Qt.red, 5)
painter.setPen(pen)
line = QLineF(self.point_list[0], self.cursor_point)
painter.drawLine(line)
painter.end()
else:
painter = QPainter()
painter.begin(self)
pen = QPen(Qt.red, 5)
painter.setPen(pen)
polygon = QPolygonF(self.point_list + [self.cursor_point])
painter.drawPolygon(polygon)
painter.end()
def mousePressEvent(self, event):
if self.end_point:
self.point_list = []
self.end_point = None
self.point_list.append(event.pos())
self.update()
def mouseDoubleClickEvent(self, event) -> None:
self.end_point = event.pos()
self.point_list.append(self.end_point)
self.update()
def mouseMoveEvent(self, event):
self.cursor_point = event.pos()
self.update()
if __name__ == '__main__':
app = QApplication([])
demo = DrawPolygon()
demo.show()
app.exec_()