pyqt 椭圆标注

目录

pyqt 椭圆标注 四个方向可以调整,调整时,另一端固定,只调整当前端。

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_())

相关推荐

  1. pyqt 椭圆标注

    2024-06-12 02:50:01       9 阅读
  2. pyqt 标题栏设置

    2024-06-12 02:50:01       13 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-12 02:50:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-12 02:50:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-12 02:50:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-12 02:50:01       20 阅读

热门阅读

  1. GO语言 环境搭建

    2024-06-12 02:50:01       11 阅读
  2. 日志通关4:logback

    2024-06-12 02:50:01       9 阅读
  3. 第一章 - 第7节- 信息编码表示 - 课件

    2024-06-12 02:50:01       9 阅读
  4. Android基础-View与ViewGroup

    2024-06-12 02:50:01       8 阅读
  5. NumPy基础(数组与向量化计算)

    2024-06-12 02:50:01       11 阅读
  6. Windows 蓝牙无法连接 解决方案

    2024-06-12 02:50:01       9 阅读
  7. 2. 基础数据结构之哈希表

    2024-06-12 02:50:01       10 阅读
  8. 面试题:String 、StringBuffer 、StringBuilder的区别

    2024-06-12 02:50:01       8 阅读
  9. Leetcode 3175. Find The First Player to win K Games in a Row

    2024-06-12 02:50:01       13 阅读
  10. Flask-REXTx 学习笔记——2.字段掩码(Fields masks)

    2024-06-12 02:50:01       10 阅读
  11. Qt6 播放音视频

    2024-06-12 02:50:01       11 阅读