一、概述
案例:在使用OpenCV的grabCut算法實現簡單摳圖操作的時候(因為使用到了鼠標坐標選擇目標區域),使用到的Qt的鼠標的mousePressEvent(按下)、mouseMoveEvent(移動)、mouseReleaseEvent(釋放)事件。實驗下來其中只有mousePressEvent生效。看了一大堆的資料:說的最多的是設置setMouseTracking(true),但是在我這里行不通。
解決辦法:1.在mousePressEvent中調用grabMouse()方法 2.在mouseReleaseEvent中調用releaseMouse()方法。這樣親測能夠解決
ps:在這里做一個記錄供以后遇到了好查看,也給其他的小伙伴帶去一點小思路。下面是樣例圖:
二、代碼樣例
void CrabCut_Matting::mouseMoveEvent(QMouseEvent *event){ // if(event->button()==Qt::LeftButton){//鼠標左鍵 rect = Rect(Point(rect.x, rect.y), Point(event->pos().x(), event->pos().y())); qDebug()<<"mouseMoveEvent:"<<rect.width<<"|"<<rect.height; showImage(); // } } void CrabCut_Matting::mousePressEvent(QMouseEvent *event){ grabMouse(); if(event->button()==Qt::LeftButton){//鼠標左鍵 rect.x = event->pos().x(); rect.y = event->pos().y(); rect.width = 1; rect.height = 1; init = false; numRun = 0; qDebug()<<"mousePressEvent:"<<event->pos().x()<<"|"<<event->pos().y(); } } void CrabCut_Matting::mouseReleaseEvent(QMouseEvent *event){ releaseMouse(); if(event->button()==Qt::LeftButton){//鼠標左鍵 if (rect.width > 1 && rect.height > 1) { setROIMask(); showImage(); qDebug()<<"mouseReleaseEvent:"<<rect.width<<"|"<<rect.height; } //執行grabcut的代碼 runGrabCut(); numRun++; showImage(); } }