pyqt5如何在label中实现可用鼠标改变长和宽,可旋转的矩形,代码实现

时间: 2024-05-08 12:18:56 浏览: 14
以下是实现可用鼠标改变长和宽,可旋转矩形的代码: ```python from PyQt5.QtCore import Qt, QPoint, QRectF from PyQt5.QtGui import QMouseEvent, QPainter, QPen from PyQt5.QtWidgets import QWidget, QApplication, QLabel class RotatableRect(QWidget): def __init__(self, parent=None): super(RotatableRect, self).__init__(parent) self.setMouseTracking(True) self.dragging = False self.resizing = False self.rotating = False self.origin_x = 0 self.origin_y = 0 self.current_x = 0 self.current_y = 0 self.angle = 0 self.width = 100 self.height = 50 self.setFixedSize(self.width, self.height) self.setCursor(Qt.CrossCursor) def mousePressEvent(self, event: QMouseEvent) -> None: self.origin_x = event.pos().x() self.origin_y = event.pos().y() if self.isInResizeRect(event.pos()): self.resizing = True elif self.isInRotateRect(event.pos()): self.rotating = True else: self.dragging = True def mouseReleaseEvent(self, event: QMouseEvent) -> None: self.dragging = False self.resizing = False self.rotating = False self.setCursor(Qt.CrossCursor) def mouseMoveEvent(self, event: QMouseEvent) -> None: self.current_x = event.pos().x() self.current_y = event.pos().y() if self.dragging and event.buttons() == Qt.LeftButton: self.move(self.pos() + event.pos() - QPoint(self.origin_x, self.origin_y)) elif self.resizing and event.buttons() == Qt.LeftButton: self.width = max(self.width + self.current_x - self.origin_x, 20) self.height = max(self.height + self.current_y - self.origin_y, 20) self.setGeometry(self.x(), self.y(), self.width, self.height) self.origin_x = self.current_x self.origin_y = self.current_y elif self.rotating and event.buttons() == Qt.LeftButton: x = event.pos().x() - self.width / 2 y = event.pos().y() - self.height / 2 if x != 0: self.angle = -y / x if x > 0 else (3 * 3.1415926535 - y) / x else: self.angle = 3.1415926535 if y < 0 else 0 self.update() else: if self.isInResizeRect(event.pos()): self.setCursor(Qt.SizeFDiagCursor) elif self.isInRotateRect(event.pos()): self.setCursor(Qt.PointingHandCursor) else: self.setCursor(Qt.CrossCursor) def isInResizeRect(self, pos: QPoint) -> bool: return self.width - pos.x() < 10 and self.height - pos.y() < 10 def isInRotateRect(self, pos: QPoint) -> bool: return abs(pos.x() - self.width / 2) < 10 and abs(pos.y() - self.height / 2) < 10 def paintEvent(self, event) -> None: painter = QPainter(self) painter.setPen(QPen(Qt.black, 2, Qt.SolidLine)) painter.translate(self.width / 2, self.height / 2) painter.rotate(self.angle * 180 / 3.1415926535) painter.drawRect(QRectF(-self.width / 2, -self.height / 2, self.width, self.height)) painter.setPen(QPen(Qt.red, 2, Qt.SolidLine)) painter.drawLine(QPointF(self.width / 2, self.height / 2), QPointF(self.width / 2 + 20, self.height / 2)) class MainWindow(QWidget): def __init__(self): super().__init__() self.label = QLabel(self) self.label.setPixmap(self.getPixmap()) self.setGeometry(0, 0, 400, 300) def getPixmap(self): rect = RotatableRect() pixmap = rect.grab() return pixmap if __name__ == "__main__": app = QApplication([]) window = MainWindow() window.show() app.exec_() ``` 在 `MainWindow` 中设置一个 `QLabel`,并将其内容设置为上述代码中 `RotatableRect` 绘制的矩形的截图。这样就可以在 `QLabel` 中显示可拖动、可改变大小和旋转的矩形。 注意:本代码仅实现了矩形的基本拖动、改变大小和旋转功能,并没有考虑边界情况、触摸屏幕等情况。可以根据实际需求进行修改和完善。

相关推荐

最新推荐

recommend-type

PyQt5 在label显示的图片中绘制矩形的方法

今天小编就为大家分享一篇PyQt5 在label显示的图片中绘制矩形的方法,具有很好的参考价值。希望对大家有所帮助。一起跟随小编过来看看吧
recommend-type

PyQt5实现仿QQ贴边隐藏功能的实例代码

主要介绍了PyQt5实现仿QQ贴边隐藏功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
recommend-type

pyqt5 实现 下拉菜单 + 打开文件的示例代码

今天小编就为大家分享一篇pyqt5 实现 下拉菜单 + 打开文件的示例代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
recommend-type

python 中pyqt5 树节点点击实现多窗口切换问题

主要介绍了python 中pyqt5 树节点点击实现多窗口切换问题,文中给大家介绍了python pyqt5 点击按钮来打开另一个窗口的方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴借鉴价值,需要的朋友可以参考...
recommend-type

自定义实现 PyQt5 下拉复选框 ComboCheckBox的完整代码

主要介绍了自定义实现 PyQt5 下拉复选框 ComboCheckBox的完整代码,本文通过实例代码讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB取整函数与Web开发的作用:round、fix、floor、ceil在Web开发中的应用

![MATLAB取整函数与Web开发的作用:round、fix、floor、ceil在Web开发中的应用](https://img-blog.csdnimg.cn/2020050917173284.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2thbmdqaWVsZWFybmluZw==,size_16,color_FFFFFF,t_70) # 1. MATLAB取整函数概述** MATLAB取整函数是一组强大的工具,用于对数值进行
recommend-type

我想做python的算法工程师,我应该学什么?学习的顺序是什么?网上有什么推荐的免费课程吗?回答具体精确一点不要太笼统

对于想要成为 Python 算法工程师的人来说,他们应该先从掌握 Python 的基础语法开始,然后学习数据结构和算法,并且要深入了解 Python 中的一些科学计算和数据处理库,比如 NumPy、Pandas 等。 学习的顺序可以是先学习基础语法和编程技巧,然后再学习数据结构和算法相关的知识,最后深入了解数据处理和科学计算相关的库。 对于免费课程的推荐,我建议你可以先去 Coursera、edX、Udacity 等网站上寻找相关课程,这些网站上有很多优质的 Python 编程和算法课程,你可以根据自己的需求和学习进度进行选择。此外,还可以考虑一些在线编程网站,如 HackerRank、L
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。