如何使用PyQt的QLabel组件实现选定目标框功能

  介绍

这篇文章主要讲解了如何使用PyQt的QLabel组件实现选定目标框功能,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。

, # 8195;及# 8195;基于<代码> PyQt5 开发了一个可以用于目标跟踪的软件,在开发过程中遇到一个问题,就是如何在<代码> PyQt5> QLable> opencv> cv2.selectROI() ,我的目的就是在<代码> QLabel> cv2.selectROI() 的功能,这样在运行程序的过程中,就能在视频框里面直接选取感兴趣区域。

具体要实现的功能,是在视频显示区域,点击鼠标左键,开启选择,按照鼠标左键,移动游标,慢慢地绘制出红色的目标框。释放鼠标左键就停止选择目标框。最开始以为<代码> PyQt> QLabel> 标签> QLabel> 对象上位置信号。<代码> PyQt 本来就有自己的事件循环,当鼠标落在视频显示区域的时候,触发到<代码>标签>

这里要记录的就是鼠标按下左键时候的起始坐标<代码> pos_1> pos_2 ,<代码> pos_1=(x0, y0) ,<代码> pos_2=(x1, y1)

重写按下鼠标事件按下鼠标左键,触发事件函数<代码> mousePressEvent() ,事件函数打开绘制标志位<代码>自我。select_roi_flag> x0, y0>

重写释放鼠标事件按下鼠标左键,触发事件函数<代码> mousePressEvent() ,关闭绘制标志位<代码>自我。select_roi_flag>

绘制事件继承鼠标事件绘制类,创建画笔类对象,在这可以设置画笔的颜色,画线的粗细,如果绘制标志位<代码> self.select_roi_flag> (x1, y1> QRect> PyQt> 矩形=(x, y, w, h)>

具体实现代码:

。QtWidgets进口QLabel
  从PyQt5。QtCore进口Qt, QRect
  从PyQt5。QtGui进口QPainter QPen
  
  类标签(QLabel):
  x0=0
  y0=0
  x1=0
  日元=0
  open_mouse_flag=False
  select_roi_flag=False
  draw_roi_flag=False
  clear_flag=False
  矩形=QRect ()
  
  #按下鼠标
  def mousePressEvent(自我、事件):
  如果自我。open_mouse_flag是正确的:
  self.select_roi_flag=True
  self.x0=event.x ()
  self.y0=event.y ()
  
  #释放鼠标
  def mouseReleaseEvent(自我、事件):
  self.select_roi_flag=False
  
  #移动鼠标
  def摇干(自我、事件):
  如果自我。select_roi_flag是正确的:
  self.x1=event.x ()
  self.y1=event.y ()
  如果自我。draw_roi_flag是正确的:
  self.update ()
  
  #绘制事件
  def paintEvent(自我、事件):
  super () .paintEvent(事件)
  画家=QPainter(自我)
  painter.setPen (QPen (Qt。红色5 Qt.SolidLine))
  如果自我。clear_flag是正确的:
  self.x0=0
  self.y0=0
  self.x1=0
  self.y1=0
  自我。矩形=QRect(自我。x0,自我。y0, abs(自我。x1 - self.x0), abs(自我。y1 - self.y0))
  painter.drawRect (self.rect)
  self.update () 

子类标签<代码> 除了能自定义选择目标框,还要在更新内容是清除绘制内容,实现这个功能可以通过设置清空标志位<代码> clear_flag> 具体实现代码:

 #清除标签对象的绘制内容
  def clear_label(自我):
  self.label_show。clear_flag=True
  self.label_show.clear () 

此外我还重写了键盘事件,通过敲击键盘来控制鼠标的绘制事件,这里的内容主要包括切换游标,开启绘制事件,确认绘制事件。

具体实现代码:

 #重写键盘事件
  def keyPressEvent(自我,QKeyEvent):
  如果自我。open_keyboard_flag是真的:#当键盘事件为真的是才有键盘事件监控
  如果QKeyEvent.key ()==Qt.Key_S:
  self.label_show.setCursor (Qt.CrossCursor) #切换游标为十字型
  self.label_show。open_mouse_flag=True
  self.label_show。draw_roi_flag=True
  如果QKeyEvent.key ()==Qt.Key_Q: #按下& # 39;提问# 39;键键盘监控关闭
  self.label_show.unsetCursor ()
  self.label_show。draw_roi_flag=False
  self.label_show。open_mouse_flag=False
  自我。open_keyboard_flag=False 

如何使用PyQt的QLabel组件实现选定目标框功能