ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-07-11 01:01:00  阅读:418  来源: 互联网

标签:滚轮 自定义 MyLabel QAction pos height width event 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截图

 

标签:滚轮,自定义,MyLabel,QAction,pos,height,width,event,QLabel
来源: https://www.cnblogs.com/xcn-img/p/14987289.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有