重写QT中Qlabel控件,实现对显示的QImage放大缩小。

重写Qlabel类为ZoomableLabel

#pragma once
#include <QLabel>
#include <QPainter>
#include <QWheelEvent>
#include <QMouseEvent>
#include <QPixmap>


class ZoomableLabel : public QLabel {
	Q_OBJECT

public:
	QPixmap originalPixmap;
	double zoomValue;
	int xMove;
	int yMove;
	QPoint oldPos;
	bool pressed;

	explicit ZoomableLabel(QWidget *parent = nullptr)
		: QLabel(parent),
		zoomValue(1), xMove(0), yMove(0), pressed(false) {}

	void setPixmap(const QPixmap &pixmap) {	
		zoomValue = qMin((float)this->width() / pixmap.width(), (float)this->height() / pixmap.height());
		originalPixmap = pixmap;
		update(); // 立即更新显示
	}

protected:
	void wheelEvent(QWheelEvent *event) override
	{
		QPoint numDegrees = event->angleDelta() / 8;
		if (!numDegrees.isNull()) 
		{
			// 根据滚轮滚动的方向和角度进行操作
			if (numDegrees.y() > 0) 
			{
				// 向上滚动
				// 放大
				zoomIn();
			}
			else if (numDegrees.y() < 0) 
			{
				// 向下滚动
				// 缩小
				zoomOut();
			}
			update();
		}
	//	event->accept();		
	}

	void mousePressEvent(QMouseEvent *event) override
	{
		if (event->button() == Qt::LeftButton)
		{
			oldPos = event->pos();
			pressed = true;
		}
		else if (event->button() == Qt::RightButton)
		{
			xMove = 0;
			yMove = 0;
			zoomValue = qMin((float)this->width() / originalPixmap.width(), (float)this->height() / originalPixmap.height());
			update();
		}
	}

	void mouseMoveEvent(QMouseEvent *event) override {
		if (pressed) {
			QPoint pos = event->pos();
			xMove += pos.x() - oldPos.x();
			yMove += pos.y() - oldPos.y();
			oldPos = pos;
			update(); // 更新显示以反映拖动
		}
	}

	void mouseReleaseEvent(QMouseEvent *event) override {
		if (event->button() == Qt::LeftButton) {
			pressed = false;
		}
	}

	private slots:
	void zoomIn() {
		zoomValue = qMin(zoomValue + 0.1, 5.0);
	}

	void zoomOut() {
		zoomValue = qMax(zoomValue - 0.1, 0.1);
	}

private:
	void paintEvent(QPaintEvent *event) override
	{
		QLabel::paintEvent(event);
		QPainter painter(this);
		if (!originalPixmap.isNull())
		{
			QPixmap scaledPixmap = originalPixmap.scaled(originalPixmap.width() * zoomValue,
				originalPixmap.height() * zoomValue,Qt::KeepAspectRatio,Qt::SmoothTransformation);
			QRect targetRect(xMove, yMove, scaledPixmap.width(), scaledPixmap.height());
			painter.drawPixmap(targetRect.topLeft(), scaledPixmap);
		}		
	}
};

调用方式

	Mat src = imread("123.bmp");
	QImage qImage = cvMatToQImage(src);
	ui.label_CameraShow->setPixmap(QPixmap::fromImage(qImage));	

Mat转Qimage

QImage cvMatToQImage(cv::Mat inMat)
{
	switch (inMat.type()) {
		// 8-bit, 4 channel
	case CV_8UC4: {
		QImage image(inMat.data, inMat.cols, inMat.rows, static_cast<int>(inMat.step), QImage::Format_ARGB32);
		return image;
	}
				  // 8-bit, 3 channel
	case CV_8UC3: {
		QImage image(inMat.data, inMat.cols, inMat.rows, static_cast<int>(inMat.step), QImage::Format_RGB888);
		return image.rgbSwapped();
	}
				  // 8-bit, 1 channel
	case CV_8UC1: {
		static QVector<QRgb> sColorTable;
		// only create our color table once
		if (sColorTable.isEmpty()) {
			for (int i = 0; i < 256; ++i) {
				sColorTable.push_back(qRgb(i, i, i));
			}
		}
		QImage image(inMat.data, inMat.cols, inMat.rows, static_cast<int>(inMat.step), QImage::Format_Indexed8);
		image.setColorTable(sColorTable);
		return image;
	}
	default:
		break;
	}
	return QImage();
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大块头爱编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值