自定義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截圖

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM