pyqt实现的鼠标划取ROI区域

9 篇文章 0 订阅

1.主题思路: 首先加载bin图像数据,然后QPixmap显示图像,最后自定义继承QLabel的子类,实现截图

2.遇到的问题:实现过程中,出现一个问题,使用自定义的label子类,显示的图像很小,不知道为什么要需要将QLael   resize 一下,有大神明白的,欢迎留言

mylabel类

from PyQt5.QtWidgets import QLabel
from PyQt5.QtCore import QRect, Qt, QPoint, pyqtSignal, QObject
from PyQt5.QtGui import QPainter, QPen


class SignalObj(QObject):
    """
    定义一个信号的类
    """
    # 自定义一个信号,注意这个地方定义约束发送出去的参数类型,下面要一致
    sendMsg = pyqtSignal()

    def __init__(self):
        super().__init__()
    def run(self):
        self.sendMsg.emit()

class MyLabel(QLabel):
    def __init__(self,parent=None):
        super(MyLabel, self).__init__(parent)

        self.ratio = None
        self.height = None
        self.width = None
        self.x0=0
        self.y0=0
        self.x1=0
        self.y1=0
        self.startPoint = QPoint()
        self.endPoint =QPoint()
        self.flag=False
        self.move=False     # 存在移动
        self.isCrossBorder=False

        #信号槽
        self.cutFinished = SignalObj()

    def setWidthAndHeight(self,label_width,label_height,ratio):
        self.width = label_width
        self.height = label_height
        self.resize(self.width,self.height)  #重新设定label大小,否则会出现绘制区域很小的bug 原因未知
        self.ratio = ratio

    # 鼠标移动事件
    def mouseMoveEvent(self, event):
        # barHeight = self.bar.height()
        self.move = True
        if self.flag:
            self.x1 = event.pos().x()
            self.y1 = event.pos().y()
            self.update()
            if self.x1>self.width or self.y1>self.height:
                self.isCrossBorder=True
            else:
                self.isCrossBorder = False


    # 鼠标释放事件
    def mouseReleaseEvent(self, event):
        self.flag = False
        self.move=False
        print(self.x0,self.y0,self.x1,self.y1)
        self.startPoint = (int(self.x0*self.ratio), int(self.y0*self.ratio))
        self.endPoint = (int(self.x1*self.ratio), int(self.y1*self.ratio))
        self.cutFinished.run()
        self.x0, self.y0, self.x1, self.y1=(0,0,0,0)
        print(self.x0, self.y0, self.x1, self.y1)


    # 绘制事件
    def paintEvent(self, event):
        super().paintEvent(event)
        if self.flag and self.move and self.x1<= self.width and self.y1<= self.height:     # 只有当鼠标按下并且移动状态
            rect = QRect(self.x0, self.y0, abs(self.x1 - self.x0), abs(self.y1 - self.y0))
            painter = QPainter(self)
            painter.setPen(QPen(Qt.red, 2, Qt.SolidLine))
            painter.drawRect(rect)

        # print(self.x0, self.y0, self.x1, self.y1)


    # 单击鼠标触发事件
    def mousePressEvent(self, event):
        # barHeight = self.bar.height()
        self.x0 = event.pos().x()
        self.y0 = event.pos().y()
        self.flag = True


调用

self.mylabel = MyLabel(self.label)
self.mylabel.cutFinished.sendMsg.connect(self.slot_showScreenPic)

 3.QPixmap中的setPixmap和drawPixmap使用区别,哪位大师明白,望告知。我使用的过程中,setPixmap后,未使用自定义label类,使用过滤器eventFileter在主界面指向绘图的label,但是画圈只能在图像下层显示,不知如何解决?

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是使用PyQt实现鼠标右键拖拽图片平移的简单示例代码: ```python from PyQt5.QtCore import Qt from PyQt5.QtGui import QPixmap from PyQt5.QtWidgets import QApplication, QGraphicsScene, QGraphicsView class ImageViewer(QGraphicsView): def __init__(self, parent=None): super(ImageViewer, self).__init__(parent) # 创建场景 self.scene = QGraphicsScene(self) self.setScene(self.scene) # 加载图像 self.image = QPixmap('image.png') # 添加图像到场景 self.image_item = self.scene.addPixmap(self.image) # 开启拖拽模式 self.setDragMode(QGraphicsView.ScrollHandDrag) # 重写鼠标按下事件 self.mousePressEvent = self.on_mouse_press_event # 重写鼠标移动事件 self.mouseMoveEvent = self.on_mouse_move_event def on_mouse_press_event(self, event): # 如果是鼠标右键按下,则记录鼠标位置 if event.button() == Qt.RightButton: self.last_mouse_pos = event.pos() else: super().mousePressEvent(event) def on_mouse_move_event(self, event): # 如果是鼠标右键移动,则计算偏移量并移动图像 if event.buttons() == Qt.RightButton: offset = event.pos() - self.last_mouse_pos self.image_item.moveBy(offset.x(), offset.y()) self.last_mouse_pos = event.pos() else: super().mouseMoveEvent(event) if __name__ == '__main__': app = QApplication([]) viewer = ImageViewer() viewer.show() app.exec_() ``` 在这个示例中,我们重写了鼠标按下和鼠标移动事件。如果用户按下鼠标右键,则记录鼠标位置。在移动鼠标时,如果鼠标右键处于按下状态,则计算偏移量并移动图像。最后,我们将所有其他鼠标事件委托给父类处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老赵的博客

叮咚,你的赏钱已到账,嘿嘿嘿

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值