第一步:自定義一個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截圖