PyQt5 graphicsView设置图元拖动属性

Graphics View提供了一种基于图元的模型-视图编程方法,Graphics View提供了一个平面,用于管理和交互大量自定义的2D图形图元,以及一个用于可视化图元的视图窗口小部件,支持缩放和旋转。想要实现以上描述功能,首先要了解   视图(The Viee)——场景(The Scene)——图元(The Item)  三者之间的关系。

1. 视图:

QGraphicsView提供了视图窗口小部件,可以显示场景的内容。 您可以将多个视图附加到同一场景,以将多个视口提供到同一数据集中。 视图小部件是一个滚动区域,并提供滚动条以浏览大型场景。

2.场景:

提供视图场景,该场景充当QGraphicsItem对象的容器。通过调用QGraphicsScene.addItem()将图元添加到场景中,然后通过调用许多图元发现函数的一个来检索图元.

3.图元:

QGraphicsItem是场景中图形项的基类。 Graphics View为典型形状提供了几个标准图元,例如矩形(QGraphicsRectItem),椭圆(QGraphicsEllipseItem)和文本项(QGraphicsTextItem),但是当您编写自定义图元时,可以使用最强大的QGraphicsItem功能。除其他外,QGraphicsItem支持以下功能:

  • 鼠标按下,移动,释放和双击事件,以及鼠标悬停事件,滚轮事件和上下文菜单事件。
  • 键盘输入焦点和键事件
  • 拖放
  • 通过父子关系和QGraphicsItemGroup进行分组
  •  
  • 碰撞检测

忘记曾经在哪看过,有人将视图比喻为电视机的外壳,场景比喻为屏幕,图元则是出现在屏幕中的每一个内容。

 

想要设置图元的拖动属性,首先要创建图元,将读入程序的图元创建为图元,然后设置其拖动属性,创建场景,将图元添加到场景中,最后再将场景添加到视图中。

以下为程序代码:

from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import QMainWindow, QApplication, QGraphicsScene, QGraphicsPixmapItem, QGraphicsView, QGraphicsItem
from PyQt5.QtGui import QImage, QPixmap
import cv2
from Ui_picshow import Ui_MainWindow


class picturezoom(QMainWindow, Ui_MainWindow, QGraphicsView):
    """
    Class documentation goes here.
    """

    def __init__(self, parent=None):
        """
        Constructor
        @param parent reference to the parent widget
        @type QWidget
        """
        super(picturezoom, self).__init__(parent)

        self.setupUi(self)
        self.picshow.setDragMode(QGraphicsView.RubberBandDrag)  # 设置图元的拖动属性
        self.picshow.setAcceptDrops(True)  # 此窗口小部件启用了放置事件
        self.picshow.setDragMode(QGraphicsView.ScrollHandDrag)
        # self.picshow.setDragEnable
        # self.setDragEnabled(True)
        #picture_work_dir = 'Manual_mode_bmp'
        img = cv2.imread("Manual_mode_bmp\\tank-15.bmp")  # 读取图像,Manual_mode_bmp为文件夹
        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # 转换图像通道

        x = img.shape[1]  # 获取图像大小
        y = img.shape[0]

        self.zoomscale = 1  # 图片放缩尺度
        frame = QImage(img, x, y, QImage.Format_RGB888)
        pix = QPixmap.fromImage(frame)
        self.item = QGraphicsPixmapItem(pix)  # 创建像素图元
        self.item.setFlag(QGraphicsItem.ItemIsMovable)  # 使图元可以拖动,非常关键!!!!!
        self.item.setScale(self.zoomscale)
        self.scene = QGraphicsScene()  # 创建场景
        self.scene.addItem(self.item)  # 将图元添加到场景中
        self.picshow.setScene(self.scene)  # 将场景添加至视图  picshow为graphicsView视图


    @pyqtSlot()
    def on_zoomin_clicked(self):
        """
        点击缩小图像
        """
        # TODO: not implemented yet
        self.zoomscale = self.zoomscale - 0.05
        if self.zoomscale <= 0:
            self.zoomscale = 0.2
        self.item.setScale(self.zoomscale)  # 缩小图像

    @pyqtSlot()
    def on_zoomout_clicked(self):
        """
        点击方法图像
        """
        # TODO: not implemented yet
        self.zoomscale = self.zoomscale + 0.05
        if self.zoomscale >= 1.2:
            self.zoomscale = 1.2
        self.item.setScale(self.zoomscale)  # 放大图像

        def dragLeaveEvent(self, event):
            self.dragOver = False
            self.update()

        def dropEvent(self, event):
            self.dragOver = False
            self.update()


def main():
    import sys
    app = QApplication(sys.argv)
    piczoom = picturezoom()
    piczoom.show()
    app.exec_()


if __name__ == '__main__':
    main()

 

运行结果如下,途中手即为拖动图元时鼠标的样式

PyQt5 graphicsView设置图元拖动属性_第1张图片

 

你可能感兴趣的:(PyQt5 graphicsView设置图元拖动属性)