1. 需求
用QLabel显示图片,现在需要在图片上实现拖拽标注框。
2. 实现
主要参考博客《PyQt5 在 QLabel 使用 QPainter 绘制矩形》,对其中的两处代码进行修改,使得图片保真,且拖拽矩形时始终与鼠标保持一致。
直接上源码,其中图片地址img = QPixmap('./14.png')
需要自己更换。
from PyQt5.QtWidgets import QWidget, QApplication, QLabel
from PyQt5.QtCore import QRect, Qt
from PyQt5.QtGui import QImage, QPixmap, QPainter, QPen
import cv2
import sys
class MyLabel(QLabel):
x0 = 0
y0 = 0
x1 = 0
y1 = 0
flag = False
#鼠标点击事件
def mousePressEvent(self,event):
self.flag = True
self.x0 = event.x()
self.y0 = event.y()
#鼠标释放事件
def mouseReleaseEvent(self,event):
self.flag = False
#鼠标移动事件
def mouseMoveEvent(self,event):
if self.flag:
self.x1 = event.x()
self.y1 = event.y()
self.update()
#绘制事件
def paintEvent(self, event):
super().paintEvent(event)
# rect =QRect(self.x0, self.y0, abs(self.x1-self.x0), abs(self.y1-self.y0))
# 这里换成任意方向的矩形框
# 标注框的左上角和右下角坐标
x0 = min(self.x0, self.x1)
y0 = min(self.y0, self.y1)
x1 = max(self.x0, self.x1)
y1 = max(self.y0, self.y1)
width = x1 - x0
height = y1 - y0
# 矩形
rect =QRect(x0, y0, width, height)
painter = QPainter(self)
painter.setPen(QPen(Qt.red,2,Qt.SolidLine))
painter.drawRect(rect)
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.resize(675, 500)
self.move(100,50)
self.setWindowTitle('在label中绘制矩形')
self.lb = MyLabel(self) #重定义的label
# 这里直接读取图片
img = QPixmap('./14.png')
# 往显示视频的Label里 显示QImage
self.lb.setPixmap(img)
self.lb.setCursor(Qt.CrossCursor)#图片可以绘制
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
x = Example()
sys.exit(app.exec_())