随笔 - 632  文章 - 17  评论 - 54  阅读 - 93万

Qt的mouseMoveEvent捕获鼠标事件不生效的解决办法

一、概述

  案例:在使用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();
    }
}
复制代码

 

posted on   飘杨......  阅读(1993)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示