Qt 圖片查看器 支持鼠標縮放大小 拖動位置等

由於工作需要需要編寫一個圖片查看器,需要支持鼠標滾動縮放大小,鼠標移動圖片位置等,由於無法上傳gif,截取的gif示例圖暫時不上傳了,講一下大概思路

1 鼠標點擊移動圖片

    通過重寫鼠標點擊事件獲取到點位,在鼠標移動事件中進行move操作,在paintEvent中指定繪製起始點即可, 與QDialog 移動操作一樣,代碼如下

//mousePressEvent

void PicShowDlg::mousePressEvent(QMouseEvent *event)
{
	QDialog::mousePressEvent(event);
	if (this->rect().contains(event->pos()))
	{
		QPoint p(m_pix.rect().x(),m_pix.rect().y());
		QSize size =  m_pix.size();
		m_dPixTempPos = event->globalPos() - m_dPixPos;
	}
}

//鼠標移動事件

void PicShowDlg::mouseMoveEvent(QMouseEvent *event)
{
	QDialog::mouseMoveEvent(event);
	if (this->rect().contains(event->pos()))
	{
		m_dPixPos = event->globalPos() - m_dPixTempPos;
	}
}

2 放大縮小圖片

  通過重寫滾輪事件,通過滾動設置比例係數,在paintEvent中重新計算縮放後的圖片大小

//鼠標滾輪事件

void PicShowDlg::wheelEvent(QWheelEvent *event)
{
    if (event->delta() > 0)
	{
		m_rate -= 0.1;
		if (m_rate < 0.018)
			m_rate = 0.01;
	}
	else if (event->delta() < 0 )
	{
		m_rate += 0.1;
		if (m_rate >4.5)
		{
			m_rate = 5;
		}
	}
	update();
	return QDialog::wheelEvent(event);
}
// paintEvent 事件重新
void PicShowDlg::paintEvent(QPaintEvent *event)
{
	QDialog::paintEvent(event);
	QPainter p(this);
	int nH = m_pix.height()*m_rate;
	int nW = m_pix.width()*m_rate;
	QPixmap newPix = m_pix.scaled(nW,nH,Qt::KeepAspectRatio,Qt::SmoothTransformation);
	p.drawPixmap(QRect(m_dPixPos.rx()-(nW - m_pix.width())/2,m_dPixPos.ry()-(nH - m_pix.height())/2, newPix.width(),newPix.height()), newPix);
	update();
}

 

 

picShowDlg類完整代碼

.h文件

 

#pragma once

 
#include <QDialog>
#include <QPixmap>
#include <QPoint>
#include "ui_PicShowDlg.h"
class PicShowDlg:public QDialog
{
public:
	explicit PicShowDlg(QWidget *parent = nullptr);
	~PicShowDlg();
	void SetPix(const QPixmap& pix );
	void SetPix(const QString &strFile);

 
protected:
	virtual void paintEvent(QPaintEvent *event) override;
	virtual void mousePressEvent(QMouseEvent *event) override;
	virtual void mouseMoveEvent(QMouseEvent *event) override;
	virtual void wheelEvent(QWheelEvent *event) override;
	virtual void resizeEvent(QResizeEvent *event) override;
private:
	Ui::PicShowDlg *ui;
	QPixmap m_pix;
	//QRect m_paintRect;
	QPoint m_dPixTempPos;
	QPoint m_dPixPos;
	double m_rate;
};
.cpp文件
#include <QPainter>
#include <QMouseEvent>
#include <QDesktopWidget>
#include "PicShowDlg.h"

 
PicShowDlg::PicShowDlg(QWidget *parent)
	:QDialog(parent)
	,ui(nullptr)
	, m_rate(1)
{
	ui = new Ui::PicShowDlg;
	ui->setupUi(this);
	this->setWindowFlags(this->windowFlags() | Qt::WindowStaysOnTopHint);
	this->setModal(false);
	this->show();
}

 
PicShowDlg::~PicShowDlg()
{
    if(ui != nullptr)
    {
        delete ui;
        ui = nullptr;
    }
}

 
void PicShowDlg::SetPix(const QPixmap& pix)
{
	m_pix = pix;
	this->resize(m_pix.size());
}

 
void PicShowDlg::SetPix(const QString &strFile)
{
	m_pix.load(strFile);
	this->setWindowTitle(strFile);
	if (m_pix.height() > QApplication::desktop()->height() -300)
	{
		this->resize(m_pix.size() + QSize(300,0));
	}
	else if(m_pix.width() > QApplication::desktop()->width() - 400)
	{
		this->resize(m_pix.size() + QSize(0, 200));
	}
	else
	{
		this->resize(m_pix.size() + QSize(300, 200));
	}
}

 
void PicShowDlg::paintEvent(QPaintEvent *event)
{
	QDialog::paintEvent(event);
	QPainter p(this);
	int nH = m_pix.height()*m_rate;
	int nW = m_pix.width()*m_rate;
	QPixmap newPix = m_pix.scaled(nW,nH,Qt::KeepAspectRatio,Qt::SmoothTransformation);
	p.drawPixmap(QRect(m_dPixPos.rx()-(nW - m_pix.width())/2,m_dPixPos.ry()-(nH - m_pix.height())/2, newPix.width(),newPix.height()), newPix);
	update();
}

 
void PicShowDlg::mousePressEvent(QMouseEvent *event)
{
	QDialog::mousePressEvent(event);
	if (this->rect().contains(event->pos()))
	{
		QPoint p(m_pix.rect().x(),m_pix.rect().y());
		QSize size =  m_pix.size();
		m_dPixTempPos = event->globalPos() - m_dPixPos;
	}
}

 
void PicShowDlg::mouseMoveEvent(QMouseEvent *event)
{
	QDialog::mouseMoveEvent(event);
	if (this->rect().contains(event->pos()))
	{
		m_dPixPos = event->globalPos() - m_dPixTempPos;
	}
}

 
void PicShowDlg::wheelEvent(QWheelEvent *event)
{
    if (event->delta() > 0)
	{
		m_rate -= 0.1;
		if (m_rate < 0.018)
			m_rate = 0.01;
	}
	else if (event->delta() < 0 )
	{
		m_rate += 0.1;
		if (m_rate >4.5)
		{
			m_rate = 5;
		}
	}
	update();
	return QDialog::wheelEvent(event);
}

 
void PicShowDlg::resizeEvent(QResizeEvent *event)
{
	this->move((QApplication::desktop()->width() - event->size().width())/2,(QApplication::desktop()->height() - event->size().height())/2);
	m_dPixPos = QPoint((event->size().width() - m_pix.width())/2,(event->size().height() - m_pix.height())/2);
	update();
}

工程代碼鏈接 

https://download.csdn.net/download/i7891090/11975504

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章