使用label添加图片
pix = QPixmap("./data/xxx.png")self.label.setPixmap(pix)
graphicsView 空间实现图片放大缩小平移等操作
class IMG_WIN(QtWidgets.QWidget):def __init__(self,graphicsView):super().__init__()self.graphicsView=graphicsView# self.graphicsView.setStyleSheet("padding: 0px; border: 0px;") # 内边距和边界去除self.scene = QtWidgets.QGraphicsScene(self)self.graphicsView.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop) # 改变对齐方式self.graphicsView.setSceneRect(0, 0, self.graphicsView.viewport().width(),self.graphicsView.height()) # 设置图形场景大小和图形视图大小一致self.graphicsView.setScene(self.scene)self.scene.mousePressEvent = self.scene_MousePressEvent # 接管图形场景的鼠标点击事件# self.scene.mouseReleaseEvent = self.scene_mouseReleaseEventself.scene.mouseMoveEvent = self.scene_mouseMoveEvent # 接管图形场景的鼠标移动事件self.scene.wheelEvent = self.scene_wheelEvent # 接管图形场景的滑轮事件self.ratio = 1 # 缩放初始比例self.zoom_step = 0.1 # 缩放步长self.zoom_max = 2 # 缩放最大值self.zoom_min = 0.2 # 缩放最小值self.pixmapItem=Nonedef addScenes(self,img): # 绘制图形self.org = imgif self.pixmapItem != None:originX = self.pixmapItem.x()originY = self.pixmapItem.y()else:originX, originY = 0, 0 # 坐标基点self.scene.clear() # 清除当前图元img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # opencv读取的bgr格式图片转换成rgb格式self.pixmap = QtGui.QPixmap(QtGui.QImage(img[:], img.shape[1], img.shape[0], img.shape[1] * 3,QtGui.QImage.Format_RGB888)) # 转化为qlbel格式self.pixmapItem = self.scene.addPixmap(self.pixmap)self.pixmapItem.setScale(self.ratio) # 缩放self.pixmapItem.setPos(originX, originY)def scene_MousePressEvent(self, event):if event.button() == QtCore.Qt.LeftButton: # 左键按下print("鼠标左键单击") # 响应测试语句print("scenePos: ",event.scenePos())# 获取图片的原始像素origin_x = (event.scenePos().x() - self.pixmapItem.x())/self.ratioorigin_y = (event.scenePos().y() - self.pixmapItem.y())/self.ratioprint("originPos: ",origin_x,",",origin_y)self.preMousePosition = event.scenePos() # 获取鼠标当前位置# if event.button() == QtCore.Qt.RightButton: # 右键按下# print("鼠标右键单击") # 响应测试语句def scene_mouseMoveEvent(self, event):if event.buttons() == QtCore.Qt.LeftButton:# print("左键移动") # 响应测试语句self.MouseMove = event.scenePos() - self.preMousePosition # 鼠标当前位置-先前位置=单次偏移量self.preMousePosition = event.scenePos() # 更新当前鼠标在窗口上的位置,下次移动用self.pixmapItem.setPos(self.pixmapItem.pos() + self.MouseMove) # 更新图元位置# 定义滚轮方法。当鼠标在图元范围之外,以图元中心为缩放原点;当鼠标在图元之中,以鼠标悬停位置为缩放中心def scene_wheelEvent(self, event):angle = event.delta() / 8 # 返回QPoint对象,为滚轮转过的数值,单位为1/8度if angle > 0:# print("滚轮上滚")self.ratio += self.zoom_step # 缩放比例自加if self.ratio > self.zoom_max:self.ratio = self.zoom_maxelse:w = self.pixmap.size().width() * (self.ratio - self.zoom_step)h = self.pixmap.size().height() * (self.ratio - self.zoom_step)x1 = self.pixmapItem.pos().x() # 图元左位置x2 = self.pixmapItem.pos().x() + w # 图元右位置y1 = self.pixmapItem.pos().y() # 图元上位置y2 = self.pixmapItem.pos().y() + h # 图元下位置if event.scenePos().x() > x1 and event.scenePos().x() < x2 \and event.scenePos().y() > y1 and event.scenePos().y() < y2: # 判断鼠标悬停位置是否在图元中# print('在内部')self.pixmapItem.setScale(self.ratio) # 缩放a1 = event.scenePos() - self.pixmapItem.pos() # 鼠标与图元左上角的差值a2=self.ratio/(self.ratio- self.zoom_step)-1 # 对应比例delta = a1 * a2self.pixmapItem.setPos(self.pixmapItem.pos() - delta)# ----------------------------分维度计算偏移量-----------------------------# delta_x = a1.x()*a2# delta_y = a1.y()*a2# self.pixmapItem.setPos(self.pixmapItem.pos().x() - delta_x,# self.pixmapItem.pos().y() - delta_y) # 图元偏移# -------------------------------------------------------------------------else:# print('在外部') # 以图元中心缩放self.pixmapItem.setScale(self.ratio) # 缩放delta_x = (self.pixmap.size().width() * self.zoom_step) / 2 # 图元偏移量delta_y = (self.pixmap.size().height() * self.zoom_step) / 2self.pixmapItem.setPos(self.pixmapItem.pos().x() - delta_x,self.pixmapItem.pos().y() - delta_y) # 图元偏移else:# print("滚轮下滚")self.ratio -= self.zoom_stepif self.ratio < 0.2:self.ratio = 0.2else:w = self.pixmap.size().width() * (self.ratio + self.zoom_step)h = self.pixmap.size().height() * (self.ratio + self.zoom_step)x1 = self.pixmapItem.pos().x()x2 = self.pixmapItem.pos().x() + wy1 = self.pixmapItem.pos().y()y2 = self.pixmapItem.pos().y() + h# print(x1, x2, y1, y2)if event.scenePos().x() > x1 and event.scenePos().x() < x2 \and event.scenePos().y() > y1 and event.scenePos().y() < y2:# print('在内部')self.pixmapItem.setScale(self.ratio) # 缩放a1 = event.scenePos() - self.pixmapItem.pos() # 鼠标与图元左上角的差值a2=self.ratio/(self.ratio+ self.zoom_step)-1 # 对应比例delta = a1 * a2self.pixmapItem.setPos(self.pixmapItem.pos() - delta)# ----------------------------分维度计算偏移量-----------------------------# delta_x = a1.x()*a2# delta_y = a1.y()*a2# self.pixmapItem.setPos(self.pixmapItem.pos().x() - delta_x,# self.pixmapItem.pos().y() - delta_y) # 图元偏移# -------------------------------------------------------------------------else:# print('在外部')self.pixmapItem.setScale(self.ratio)delta_x = (self.pixmap.size().width() * self.zoom_step) / 2delta_y = (self.pixmap.size().height() * self.zoom_step) / 2self.pixmapItem.setPos(self.pixmapItem.pos().x() + delta_x, self.pixmapItem.pos().y() + delta_y)
# 继承类self.graphic=IMG_WIN(self.graphicsView)# 绑定按钮事件self.pushButton_2.clicked.connect(self.select_img)# 事件函数def select_img(self):img = cv2.imread("./data/triangle.png")self.graphic.addScenes(img)
实现点击获取原始像素和graphicsView的像素
在scene_MousePressEvent事件函数中
def scene_MousePressEvent(self, event):if event.button() == QtCore.Qt.LeftButton: # 左键按下print("鼠标左键单击") # 响应测试语句print("scenePos: ",event.scenePos())# 获取图片的原始像素origin_x = (event.scenePos().x() - self.pixmapItem.x())/self.ratioorigin_y = (event.scenePos().y() - self.pixmapItem.y())/self.ratio
参考链接:
https://blog.csdn.net/weixin_44821251/article/details/106290132
源文件:
