自定义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截图