QT鼠标动态移动图标放大或缩小

前言:
        为了让摄像头更好的适应现场环境进行识别!然而又不去调摄像头硬件,所以我们就需要通过手动框选来选择识别区域!

       这次我们的用的是QT 的  bool eventFilter ( QObject * obj , QEvent * event );这个函数特别好用,为什么这么说呢,因为你会发现QT的Lable是没有按键信号的,然而通过事件,就可以达到button的功能了!如果用特定的事件函数,你会发现不方便的去找到事件的目标。。。(尤其是在同一个界面中,没有自己编写的控件类)然而事件过滤器却非常方便,所以,何乐而不为呢?这里不在阐述事件过滤器是干嘛的!
     先来看下效果!
      
    用 事件过滤器前,我们需要注册一下使用过滤器的类!
    
    ui->label_f->installEventFilter(this);
   我们需要一个刷新几何图形的位置函数
    

void colorhandle::point_Config(short x_ ,short y_ ,double size_ ){
 
   
    static double temp_size =1;
    temp_size+=size_;
 
   
    double temp_width = IMAGEAREA_RL_WIDTH*temp_size;
    double temp_height = IMAGEAREA_HEIGHT*temp_size;
    static short Xpos =60,Ypos = 120;
 
   
    _L_U[0].x =Xpos+ x_;    //这里下x,y需要交换
    _L_U[0].y =Ypos+ y_;
    _L_D[0].x = _L_U[0].x;
    _L_D[0].y = temp_height + _L_U[0].y;
 
   
    _C_U[0].x = temp_width + _L_U[0].x ;
    _C_U[0].y = _L_U[0].y;
    _C_D[0].x = _C_U[0].x;
    _C_D[0].y = _L_D[0].y;
 
   
    _R_U[0].x = 2 * temp_width + _L_U[0].x;
    _R_U[0].y = _L_U[0].y;
    _R_D[0].x = _R_U[0].x;
    _R_D[0].y = _L_D[0].y;
 
   
    Xpos += x_;
    Ypos += y_;
    U_L_area_corner.clear();
    U_L_area_corner.push_back(_L_U[0]);
    U_L_area_corner.push_back(_C_U[0]);
    U_L_area_corner.push_back(_C_D[0]);
    U_L_area_corner.push_back(_L_D[0]);
 
   
    U_R_area_corner.clear();
    U_R_area_corner.push_back(_C_U[0]);
    U_R_area_corner.push_back(_R_U[0]);
    U_R_area_corner.push_back(_R_D[0]);
    U_R_area_corner.push_back(_C_D[0]);
 
   
}
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
  
一下是在colorhandle类中注册的内容
    short IMAGEAREA_RL_WIDTH = 140;
    short IMAGEAREA_HEIGHT  = 160;

    cv::Point _L_U[2];
    cv::Point _L_D[2];
    cv::Point _C_U[2];
    cv::Point _C_D[2];
    cv::Point _R_U[2];
    cv::Point _R_D[2];

    std::vectorU_L_area_corner;
    std::vectorU_R_area_corner;
    void point_Config(short x_ =0,short y_ =0,double size_ =0 );
接下来看事件过滤器函数
short last_X=0, last_Y =0;
short dir_x =0,dir_y =0;
bool temp_flag =false;
double size_step =0.05;

bool Magic::eventFilter(QObject *obj,QEvent *event){

    if(obj == ui->label_f){

        if(event->type() == QEvent::MouseButtonRelease){
            temp_flag = false;
            return true;

        }else if(event->type() == QEvent::MouseMove){
           QMouseEvent *mousevent = static_cast(event);
             dir_x =0;dir_y =0;

            if(temp_flag){
                dir_x = mousevent->pos().x()-last_X;
                dir_y = mousevent->pos().y()-last_Y;
            }
             temp_flag =true;

             last_X = mousevent->pos().x();
             last_Y = mousevent->pos().y();

             mImage->point_Config(dir_x,dir_y);

            return true;

        }else if(event->type() == QEvent::Wheel){

           QWheelEvent *wheelevent = static_cast(event);

           if(wheelevent->delta()>0){

               mImage->point_Config(0,0,0.05);

           }else{
               mImage->point_Config(0,0,-0.05);
           }
           return true;

        }else{
            return false;
        }

    }

    return QMainWindow::eventFilter(obj,event);

}
 由于过滤器自身的事件函数比较简单,所以我们需要重新转换一下事件,达到相应事件相同的效果! QMouseEvent *mousevent = static_cast(event);

以上的内容,你只是刷新了几何图像的尺寸和位置,还需要在视频流中刷新显示就可以的!


你可能感兴趣的:(QT)