pyqt5如何在label中实现可用鼠标改变长和宽,可旋转的矩形,代码实现
时间: 2024-05-05 18:19:03 浏览: 16
以下是一个实现这些功能的简单的 PyQT5 代码:
```
from PyQt5.QtCore import Qt, QRectF
from PyQt5.QtGui import QPainter, QPen
from PyQt5.QtWidgets import QWidget, QApplication, QLabel
class ResizableRect(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.setMinimumSize(50, 50)
self.setMouseTracking(True)
self.rect = QRectF(0, 0, self.width(), self.height())
self.drag_start = None
self.drag_type = ""
def paintEvent(self, event):
painter = QPainter(self)
painter.setPen(QPen(Qt.black, 2, Qt.SolidLine))
painter.drawRoundedRect(self.rect, 10, 10)
def mousePressEvent(self, event):
self.drag_start = event.pos()
if self.rect.topLeft().x() - 3 <= self.drag_start.x() <= self.rect.topLeft().x() + 3 \
and self.rect.topLeft().y() - 3 <= self.drag_start.y() <= self.rect.topLeft().y() + 3:
self.drag_type = "topleft"
elif self.rect.topRight().x() - 3 <= self.drag_start.x() <= self.rect.topRight().x() + 3 \
and self.rect.topRight().y() - 3 <= self.drag_start.y() <= self.rect.topRight().y() + 3:
self.drag_type = "topright"
elif self.rect.bottomLeft().x() - 3 <= self.drag_start.x() <= self.rect.bottomLeft().x() + 3 \
and self.rect.bottomLeft().y() - 3 <= self.drag_start.y() <= self.rect.bottomLeft().y() + 3:
self.drag_type = "bottomleft"
elif self.rect.bottomRight().x() - 3 <= self.drag_start.x() <= self.rect.bottomRight().x() + 3 \
and self.rect.bottomRight().y() - 3 <= self.drag_start.y() <= self.rect.bottomRight().y() + 3:
self.drag_type = "bottomright"
else:
self.drag_type = "move"
def mouseMoveEvent(self, event):
if self.drag_start is not None:
if self.drag_type == "move":
diff = event.pos() - self.drag_start
self.rect.translate(diff)
self.drag_start = event.pos()
self.update()
elif self.drag_type == "topleft":
diff = event.pos() - self.drag_start
self.rect.setTopLeft(self.rect.topLeft() + diff)
self.drag_start = event.pos()
self.update()
elif self.drag_type == "topright":
diff = event.pos() - self.drag_start
self.rect.setTopRight(self.rect.topRight() + diff)
self.drag_start = event.pos()
self.update()
elif self.drag_type == "bottomleft":
diff = event.pos() - self.drag_start
self.rect.setBottomLeft(self.rect.bottomLeft() + diff)
self.drag_start = event.pos()
self.update()
elif self.drag_type == "bottomright":
diff = event.pos() - self.drag_start
self.rect.setBottomRight(self.rect.bottomRight() + diff)
self.drag_start = event.pos()
self.update()
def mouseReleaseEvent(self, event):
self.drag_start = None
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
w = QWidget()
layout = QVBoxLayout()
label = QLabel()
label.setMinimumSize(200, 200)
label.setPixmap(QPixmap("test.png"))
layout.addWidget(label)
rect = ResizableRect()
rect.setGeometry(50, 50, 50, 50)
layout.addWidget(rect)
w.setLayout(layout)
w.show()
sys.exit(app.exec_())
```
这个代码先创建了一个名为 `ResizableRect` 的 QWidget 子类。它有一个矩形属性,可以通过鼠标拖动而调整大小或位置。这个自定义的 QWidget 随后被添加到包含 QLabel 的主要布局中。
注意,这只是一个简单的 PyQT5 代码示例,肯定还有其他可以实现这个的方法。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)