目录
pyqt 椭圆标注 四个方向可以调整,调整时,另一端固定,只调整当前端。
pyqt 椭圆标注 四个方向可以调整,调整时,另一端固定,只调整当前端。
import sys
from PyQt5.QtWidgets import QApplication, QLabel, QMainWindow
from PyQt5.QtGui import QPixmap, QPainter, QPen, QCursor
from PyQt5.QtCore import Qt, QRect, QPoint, QPointF
class ImageLabel(QLabel):
def __init__(self, pixmap):
super().__init__()
self.setPixmap(pixmap)
self.ellipse_rect = QRect(400, 400, 400, 200)
self.dragging = False
self.moving = False
self.setMouseTracking(True)
self.background_image = QPixmap('1023.jpg')
def paintEvent(self, event):
super().paintEvent(event)
painter = QPainter(self)
painter.drawPixmap(self.rect(), self.background_image)
pen = QPen(Qt.red, 2)
painter.setPen(pen)
painter.drawEllipse(self.ellipse_rect)
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
if self.is_on_edge(event.pos()):
self.dragging = True
self.drag_start_pos = event.pos()
self.ellipse_start_rect = self.ellipse_rect
self.fixed_point = self.get_fixed_point(event.pos())
elif self.ellipse_rect.contains(event.pos()):
self.moving = True
self.move_start_pos = event.pos()
self.ellipse_start_pos = self.ellipse_rect.topLeft()
def mouseMoveEvent(self, event):
print('dx,dy', event.pos())
if self.dragging:
dx = event.pos().x() - self.drag_start_pos.x()
dy = event.pos().y() - self.drag_start_pos.y()
new_rect = QRect(self.ellipse_start_rect)
if self.fixed_point == 'top-left':
new_rect.setRight(new_rect.right() + dx)
new_rect.setBottom(new_rect.bottom() + dy)
elif self.fixed_point == 'top-right':
new_rect.setLeft(new_rect.left() + dx)
new_rect.setBottom(new_rect.bottom() + dy)
elif self.fixed_point == 'bottom-left':
new_rect.setRight(new_rect.right() + dx)
new_rect.setTop(new_rect.top() + dy)
elif self.fixed_point == 'bottom-right':
new_rect.setLeft(new_rect.left() + dx)
new_rect.setTop(new_rect.top() + dy)
self.ellipse_rect = new_rect
self.update()
elif self.moving:
dx = event.pos().x() - self.move_start_pos.x()
dy = event.pos().y() - self.move_start_pos.y()
new_top_left = self.ellipse_start_pos + QPoint(dx, dy)
self.ellipse_rect.moveTopLeft(new_top_left)
self.update()
else:
if self.is_on_edge(event.pos()):
self.setCursor(QCursor(Qt.SizeAllCursor))
elif self.ellipse_rect.contains(event.pos()):
self.setCursor(QCursor(Qt.OpenHandCursor))
else:
self.setCursor(QCursor(Qt.ArrowCursor))
def mouseReleaseEvent(self, event):
if event.button() == Qt.LeftButton:
self.dragging = False
self.moving = False
self.setCursor(QCursor(Qt.ArrowCursor))
def is_on_edge(self, pos):
resize_margin = 10 # 增大点击区域的宽度
left_edge = abs(pos.x() - self.ellipse_rect.left()) < resize_margin
right_edge = abs(pos.x() - self.ellipse_rect.right()) < resize_margin
top_edge = abs(pos.y() - self.ellipse_rect.top()) < resize_margin
bottom_edge = abs(pos.y() - self.ellipse_rect.bottom()) < resize_margin
return left_edge or right_edge or top_edge or bottom_edge
def get_fixed_point(self, pos):
left_dist = abs(pos.x() - self.ellipse_rect.left())
right_dist = abs(pos.x() - self.ellipse_rect.right())
top_dist = abs(pos.y() - self.ellipse_rect.top())
bottom_dist = abs(pos.y() - self.ellipse_rect.bottom())
if left_dist < right_dist and top_dist < bottom_dist:
return 'bottom-right'
elif left_dist < right_dist and top_dist >= bottom_dist:
return 'top-right'
elif left_dist >= right_dist and top_dist < bottom_dist:
return 'bottom-left'
else:
return 'top-left'
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Resizable Ellipse with Fixed Opposite Point")
self.setGeometry(100, 100, 800, 600)
pixmap = QPixmap(800, 600)
pixmap.fill(Qt.white)
self.image_label = ImageLabel(pixmap)
self.setCentralWidget(self.image_label)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
pyqt 画椭圆中心点固定,调整是,两端一起调整。
import sys
from PyQt5.QtWidgets import QApplication, QLabel, QMainWindow
from PyQt5.QtGui import QPixmap, QPainter, QPen, QCursor
from PyQt5.QtCore import Qt, QRect, QPoint, QPointF
class ImageLabel(QLabel):
def __init__(self, pixmap):
super().__init__()
self.setPixmap(pixmap)
self.ellipse_rect = QRect(400, 400, 400, 200)
self.dragging = False
self.moving = False
self.setMouseTracking(True)
self.background_image = QPixmap('1023.jpg')
self.initial_radius_x = self.ellipse_rect.width() // 2
self.initial_radius_y = self.ellipse_rect.height() // 2
def paintEvent(self, event):
super().paintEvent(event)
painter = QPainter(self)
painter.drawPixmap(self.rect(), self.background_image)
pen = QPen(Qt.red, 2)
painter.setPen(pen)
painter.drawEllipse(self.ellipse_rect)
# 绘制中心点的大十字
center = self.ellipse_rect.center()
cross_size = 2000 # 十字线的长度
pen = QPen(Qt.blue, 3) # 设置用于十字的笔,颜色蓝色,线宽3
painter.setPen(pen)
painter.drawLine(center.x() - cross_size, center.y(), center.x() + cross_size, center.y()) # 水平线
painter.drawLine(center.x(), center.y() - cross_size, center.x(), center.y() + cross_size) # 垂直线
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
if self.is_on_edge(event.pos()):
self.dragging = True
self.drag_start_pos = event.pos()
self.ellipse_start_rect = self.ellipse_rect
self.fixed_point = self.ellipse_rect.center() # 使用中心作为固定点
self.initial_radius_x = self.ellipse_rect.width() // 2
self.initial_radius_y = self.ellipse_rect.height() // 2
elif self.ellipse_rect.contains(event.pos()):
self.moving = True
self.move_start_pos = event.pos()
self.ellipse_start_pos = self.ellipse_rect.topLeft()
def mouseMoveEvent(self, event):
if self.dragging:
new_center = self.fixed_point # 中心固定
delta_x = event.pos().x() - self.drag_start_pos.x()
delta_y = event.pos().y() - self.drag_start_pos.y()
radius_x = self.initial_radius_x + delta_x
radius_y = self.initial_radius_y - delta_y
radius_x = max(radius_x, 10) # 防止半径为负值
radius_y = max(radius_y, 10) # 防止半径为负值
new_rect = QRect(new_center.x() - radius_x, new_center.y() - radius_y, 2 * radius_x, 2 * radius_y)
self.ellipse_rect = new_rect
self.update()
elif self.moving:
dx = event.pos().x() - self.move_start_pos.x()
dy = event.pos().y() - self.move_start_pos.y()
new_top_left = self.ellipse_start_pos + QPoint(dx, dy)
self.ellipse_rect.moveTopLeft(new_top_left)
self.update()
else:
if self.is_on_edge(event.pos()):
self.setCursor(QCursor(Qt.SizeAllCursor))
elif self.ellipse_rect.contains(event.pos()):
self.setCursor(QCursor(Qt.OpenHandCursor))
else:
self.setCursor(QCursor(Qt.ArrowCursor))
def mouseReleaseEvent(self, event):
if event.button() == Qt.LeftButton:
self.dragging = False
self.moving = False
self.setCursor(QCursor(Qt.ArrowCursor))
def is_on_edge(self, pos):
resize_margin = 10 # 增大点击区域的宽度
left_edge = abs(pos.x() - self.ellipse_rect.left()) < resize_margin
right_edge = abs(pos.x() - self.ellipse_rect.right()) < resize_margin
top_edge = abs(pos.y() - self.ellipse_rect.top()) < resize_margin
bottom_edge = abs(pos.y() - self.ellipse_rect.bottom()) < resize_margin
return left_edge or right_edge or top_edge or bottom_edge
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Resizable Ellipse with Fixed Opposite Point")
self.setGeometry(100, 100, 800, 600)
pixmap = QPixmap(800, 600)
pixmap.fill(Qt.white)
self.image_label = ImageLabel(pixmap)
self.setCentralWidget(self.image_label)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())