20.QT-Qpixmap實現圖片鼠標縮放,鼠標拖動示例(詳解)
阿新 • • 發佈:2018-09-19
下滑 resize pix slot https qpi map += als
#include "widget.h" Widget::Widget(): BigButton("放大",this), LittleButton("縮小",this), LiftButton("向左",this), RightButton("向右",this), UpButton("向上",this), DownButton("向下",this), Paint(10,10,810,810), Alloffset(0,0), label("100%",this) { ratio=1.0; //初始化圖片縮放比例 action= Widget::None; pixW =985; //設置圖片尺寸為985*740 pixH=740; pix =new QPixmap; pix->load(":/pic/img.jpg"); BigButton.setGeometry(822,10,60,25); connect(&BigButton,SIGNAL(clicked()),this,SLOT(onBigClicked())); LittleButton.setGeometry(822,40,60,25); connect(&LittleButton,SIGNAL(clicked()),this,SLOT(onLittleClicked())); LiftButton.setGeometry(822,70,60,25); connect(&LiftButton,SIGNAL(clicked()),this,SLOT(OnLiftClicked())); RightButton.setGeometry(822,100,60,25); connect(&RightButton,SIGNAL(clicked()),this,SLOT(OnRightClicked())); UpButton.setGeometry(822,130,60,25); connect(&UpButton,SIGNAL(clicked()),this,SLOT(onUpClicked())); DownButton.setGeometry(822,160,60,25); connect(&DownButton,SIGNAL(clicked()),this,SLOT(onDownClicked())); label.move(840,200); resize(890,850); } bool Widget::event(QEvent * event) { static bool press=false; static QPoint PreDot; if(event->type()== QEvent::MouseButtonPress ) { QMouseEvent *mouse=dynamic_cast<QMouseEvent* >(event); //判斷鼠標是否是左鍵按下,且鼠標位置是否在繪畫區域 if(mouse->button()==Qt::LeftButton &&Paint.contains(mouse->pos())) { press=true; QApplication::setOverrideCursor(Qt::OpenHandCursor); //設置鼠標樣式 PreDot =mouse->pos(); } } else if(event->type()== QEvent::MouseButtonRelease) { QMouseEvent *mouse=dynamic_cast<QMouseEvent* >(event); //判斷鼠標是否是左鍵釋放,且之前是在繪畫區域 if(mouse->button()==Qt::LeftButton && press ) { QApplication::setOverrideCursor(Qt::ArrowCursor); //改回鼠標樣式 press=false; } } if(event->type()==QEvent::MouseMove) //移動圖片 { if(press) { QMouseEvent *mouse=dynamic_cast<QMouseEvent* >(event); offset.setX(mouse->x() - PreDot.x()); offset.setY(mouse->y() - PreDot.y()); PreDot =mouse->pos(); action = Widget::Move; this->update(); } } return QWidget::event(event); } void Widget::wheelEvent(QWheelEvent* event) //鼠標滑輪事件 { if (event->delta()>0) { //上滑,縮小 action=Widget::Shrink; this->update(); } else { //下滑,放大 action=Widget::Amplification; this->update(); } event->accept(); } void Widget::paintEvent(QPaintEvent *event) { QPainter painter(this); int NowW=ratio *pixW; int NowH=ratio *pixH; if(action==Widget::Amplification) //縮小 { ratio-=0.1*ratio; if(ratio<0.018) ratio =0.01; QString str; str.sprintf("%.0f%",ratio*100); label.setText(str) ; } else if(action==Widget::Shrink) //放大 { ratio+=0.1*ratio; if(ratio>4.5) ratio =5.000; QString str; str.sprintf("%.0f%",ratio*100); label.setText(str); } if(action==Widget::Amplification || action==Widget::Shrink) //更新圖片 { NowW =ratio *pixW; NowH =ratio *pixH; pix->load(":/pic/img.jpg"); //重新裝載,因為之前的圖片已經被縮放過 *pix=pix->scaled(NowW, NowH,Qt::KeepAspectRatio); action=Widget::None; } if(action==Widget::Move) //移動 { int offsetx=Alloffset.x()+offset.x(); Alloffset.setX(offsetx); int offsety=Alloffset.y()+offset.y(); Alloffset.setY(offsety); action=Widget::None; } if(abs(Alloffset.x())>=(Paint.width()/2 + NowW/2 -10)) //限制X偏移值 { if(Alloffset.x()>0) Alloffset.setX(Paint.width()/2 + NowW/2 -10); else Alloffset.setX(-Paint.width()/2 + -NowW/2 +10); } if(abs(Alloffset.y())>=(Paint.height()/2 + NowH/2 -10)) //限制Y偏移值 { if(Alloffset.y()>0) Alloffset.setY(Paint.height()/2 + NowH/2 -10); else Alloffset.setY(-Paint.height()/2 + -NowH/2 +10); } int x=Paint.width()/2 + Alloffset.x() -NowW/2; if(x<0) x=0; int y=Paint.height()/2 + Alloffset.y() -NowH/2; if(y<0) y=0; int sx=NowW/2 - Paint.width()/2 - Alloffset.x(); if(sx<0) sx=0; int sy=NowH/2 - Paint.height()/2 - Alloffset.y(); if(sy<0) sy=0; int w=(NowW - sx)>Paint.width()? Paint.width() : (NowW - sx); if(w>(Paint.width()-x)) w =Paint.width()-x; int h=(NowH - sy)>Paint.height()? Paint.height() : (NowH - sy); if(h>(Paint.height()-y)) h =Paint.height()-y; painter.drawRect(Paint.x()-1,Paint.y()-1,Paint.width()+1,Paint.height()+1); //畫框 painter.drawTiledPixmap(x+Paint.x(),y+Paint.y(),w,h,*pix,sx,sy); //繪畫圖形 } void Widget::onLittleClicked() { action=Widget::Amplification; this->update(); } void Widget::onBigClicked() { action=Widget::Shrink; this->update(); } void Widget::onUpClicked() { action=Widget::Move; offset.setX(0); offset.setY(-20); this->update(); } void Widget::onDownClicked() { action=Widget::Move; offset.setX(0); offset.setY(20); this->update(); } void Widget::OnLiftClicked() { action=Widget::Move; offset.setX(-20); offset.setY(0); this->update(); } void Widget::OnRightClicked() { action=Widget::Move; offset.setX(20) ; offset.setY(0) ; this->update(); }
文章來源:https://www.cnblogs.com/lifexy/p/9057046.html
20.QT-Qpixmap實現圖片鼠標縮放,鼠標拖動示例(詳解)