自定义QLabel,并实现滚轮放大缩小,移动等

第一步:自定义一个class并继承自QLabel

并申明几个鼠标事件

 

第二步:重写paintEvent事件(完成绘图) 

void MyLabel::paintEvent(QPaintEvent *event)

 

{

 

  if(LocalFileName.isNull())              //QString LocalFileName 这是图像路径

 

  {

 

    return QWidget::paintEvent(event);

 

  }

 

  //加载图片

 

  if(Image.load(LocalFileName))

  {

    QPainter painter(this);

    //根据窗口计算应该显示的图片的大小

    int width = qMin(Image.width() , this->width());                                                //返回较小值

    int height = (width * 1.0)/(Image.width()*1.0 / Image.height());                        //  width / height  图像跟label会根据宽对齐。 height / width则根据长对齐 

    height = qMin(height , this->height());

    width = height * 1.0 *(Image.width() *1.0 / Image.height());

    // 平移

    painter.translate(this->width() / 2 + X_move, this->height() /2 + Y_move);     // int X_move , Y_move ; x y 轴平移的距离

    // 缩放

    painter.scale(ZoomValue , ZoomValue);                                                        //qreal ZoomValue ;鼠标缩放位置

    // 绘制图像

    QRect pecRect(-width / 2 , -height /2 , width , height);                                  //画显示框  前两个参数是坐标原地(0,0 在label 中心) 后两个天参数是长宽

    painter.drawImage(pecRect , Image);

  }else{

    qDebug() << "load failed"; 

  } 

}

 

写鼠标左键事件

void MyLabel::contextMenuEvent(QContextMenuEvent *event)

{ 

  QPoint pos = event->pos();                                                                                     //获取鼠标坐标pos;

  pos = this->mapToGlobal(pos);                                                                               //坐标转换为全局屏幕坐标

  //以上两步确认鼠标右键以后生成menu的位置跟随鼠标的当前位置

 

  //生成右键事件

  QMenu* menu = new QMenu(this);  

  //加载图片动作

  QAction *loadImage = new QAction(this);

  loadImage->setText(QString::fromLocal8Bit("选择图片"));

  connect(loadImage , &QAction::triggered , this , &MyLabel::OnSelectImage);       //OnSelectImage 槽函数

  menu->addAction(loadImage);                                                                                //将loadImage操作附加到menu的操作列表

  //menu->addSeparator();                                                                                          //添加动作到菜单中

  

  //放大动作

  QAction* zoomInAction = new QAction(this);
  zoomInAction->setText(QString::fromLocal8Bit("放大"));
  connect(zoomInAction , &QAction::triggered , this , &MyLabel::OnZoomInImage); //OnZoomInImage 槽函数
  menu->addAction(zoomInAction);

  

  //缩小动作

  QAction* zoomOutAction = new QAction(this);

  zoomOutAction->setText(QString::fromLocal8Bit("缩小"));

  connect(zoomOutAction , &QAction::triggered , this , &MyLabel::OnZoomOutImage); //OnZoomOutImage 槽函数

  menu->addAction(zoomOutAction);

 

  //还原动作

  QAction* presetAction = new QAction(this);

  presetAction->setText(QString::fromLocal8Bit("还原"));

  connect(presetAction , &QAction::triggered , this , &MyLabel::OnPresetImage);          //OnPresetImage 槽函数

  menu->addAction(presetAction); 

  

  menu->exec(pos);                                                                                                         //在鼠标位置出 执行

}

左键事件里的槽函数:

void MyLabel::OnSelectImage()

{

  LocalFileName = QFileDialog::getOpenFileName(this , "Open Image" , "./" , tr("Image (*.png *.xpm *.jpg)"));

  QFile file(LocalFileName);

  if(!file.exists()){

  qDebug() << "error img";

  return;

  }

  // 初始化 缩放量以及 xy轴坐标偏移量

  ZoomValue = 1.0;

  X_move= 0;

  Y_move= 0;

  update();

}

void MyLabel::OnZoomInImage()

{

  ZoomValue += 0.05;

  update();

}

void MyLabel::OnZoomOutImage()

{

  ZoomValue -= 0.05;

  if(ZoomValue <= 0)

  {

    ZoomValue = 0.05;

    return;

  }

  update();

}

void MyLabel::OnPresetImage()

{

  ZoomValue = 1.0;

  X_move= 0;

  Y_move= 0;

  update();

}

 

实现鼠标其他事件

void MyLabel::wheelEvent(QWheelEvent *event)                                 //鼠标滚轮事件

{

  int value = event->delta();

  if(value > 0) //放大

    OnZoomInImage();

  else //缩小

    OnZoomOutImage();

  update();

}

void MyLabel::mousePressEvent(QMouseEvent *event)            //鼠标按下

{

  old_pos = event->pos();

  Pressed = true;

}

void MyLabel::mouseMoveEvent(QMouseEvent *event)             //鼠标移动事件

{

  if(!Pressed)

    return QWidget::mouseMoveEvent(event);

  this->setCursor(Qt::SizeAllCursor);

  QPoint pos = event->pos();

  int xPtInterval = pos.x() - old_pos.x();

  int yPtInterval = pos.y() - old_pos.y();

  X_move+= xPtInterval;

  Y_move+= yPtInterval;

  old_pos = pos;

  update();

}

void MyLabel::mouseReleaseEvent(QMouseEvent *event)       //鼠标释放事件

{

  Q_UNUSED(event);

  Pressed = false;

  setCursor(Qt::ArrowCursor);

}

Mylabel.h截图

 

posted @ 2021-07-11 00:43  xcn-xcn  阅读(3763)  评论(0编辑  收藏  举报