qt鼠标悬停图片放大_20.QT-Qpixmap实现图片鼠标缩放,鼠标拖动示例(详解)

代码实现

widget.h:#ifndef WIDGET_H

#define WIDGET_H

#include

#include

class Widget : public QWidget

{

Q_OBJECT

private :

QPixmap *pix;

int action; //动作(放大,缩小,移动...)

int pixW; //图片宽

int pixH; //图片高

QRect Paint; //绘画区域

float ratio; //比例

QPoint offset; //一次的图片偏移值

QPoint Alloffset; //总偏移

QLabel label;

QPushButton BigButton;

QPushButton LittleButton;

QPushButton LiftButton;

QPushButton RightButton;

QPushButton UpButton;

QPushButton DownButton;

void AddComboItem(QComboBox* cmbo);

bool event(QEvent * event);

void wheelEvent(QWheelEvent* e); //鼠标滑轮事件

private slots:

void onUpClicked();

void onDownClicked();

void OnLiftClicked();

void OnRightClicked();

void onLittleClicked();

void onBigClicked();

void paintEvent(QPaintEvent *event);

public:

explicit Widget();

enum Type {

None = 0,

Amplification ,

Shrink,

Lift,

Right,

Up,

Down,

Move

};

};

#endif // WIDGET_H

widget.cpp:#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(event);

press=true;

PreDot = mouse->pos();

}

else if(event->type() == QEvent::MouseButtonRelease)

{

if(press)

press=false;

}

if(event->type() == QEvent::MouseMove) //移动图片

{

if(press)

{

QMouseEvent *mouse = dynamic_cast(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();

if(abs(offsetx)>=(Paint.width()/2 + NowW/2 -10)) //限制X偏移值

{

if(offsetx>0)

offsetx = Paint.width()/2 + NowW/2 -10;

else

offsetx= -Paint.width()/2 + -NowW/2 +10;

}

Alloffset.setX(offsetx);

int offsety=Alloffset.y()+offset.y();

if(abs(offsety)>=(Paint.height()/2 + NowH/2 -10)) //限制Y偏移值

{

if(offsety>0)

offsety = Paint.height()/2 + NowH/2 -10;

else

offsety= -Paint.height()/2 + -NowH/2 +10;

}

Alloffset.setY(offsety);

action=Widget::None;

}

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();

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值