QT:QGraphicsView实现图片放缩、鼠标拖动移动和鼠标点击位置放大缩小

免责声明:

本文所提供的信息和内容仅供参考。作者对本文内容的准确性、完整性、及时性或适用性不作任何明示或暗示的保证。在任何情况下,作者不对因使用本文内容而导致的任何直接或间接损失承担责任,包括但不限于数据丢失、业务中断或其他经济损失。

读者在使用本文信息时,应自行验证其准确性和适用性,并对其使用结果负责。本文内容不构成专业技术咨询或建议,具体的技术实现和应用应根据实际情况和需要进行详细分析和验证。

本文所涉及的任何商标、版权或其他知识产权均属于其各自的所有者。若本文中引用了第三方的资料或信息,引用仅为学术交流目的,不构成对第三方内容的认可或保证。

若有任何疑问或需进一步信息,请联系本文作者或相关专业人士。


前言

作为FPGA开发者,在调试图像处理时,通常需要将上位机接收到的图像进行显示。然而,显示器的分辨率可能无法与图像的原始分辨率匹配,这时就需要对图像进行缩放处理。Qt 提供了现成的库,QGraphicsView 能轻松实现图像的缩放、鼠标拖动移动,以及通过鼠标点击位置实现放大缩小等功能,帮助开发者高效地进行图像调试和可视化操作。


一、定义QGraphicsView和QGraphicsView

首先,更新你的 QtGuiApplication 类,使其包含 QGraphicsViewQGraphicsScene,并重写 wheelEvent 函数来处理缩放操作。

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_QtGuiApplication3.h"
#include <QGraphicsView>
#include <QGraphicsView>




class QtGuiApplication3 : public QMainWindow
{
	Q_OBJECT

public:
	QtGuiApplication3(QWidget *parent = Q_NULLPTR);

private:
	Ui::QtGuiApplication3Class ui;

	QGraphicsView* view;
	QGraphicsScene* scene;
	double scaleFactor;

protected:
	// 重写鼠标滚轮事件,处理缩放
	void wheelEvent(QWheelEvent* event) override;


};

二、在 QtGuiApplication2.cpp 中实现功能

接下来,实现构造函数和 wheelEvent 事件处理函数,来实现图片的缩放和拖动功能。

#include "QtGuiApplication3.h"
#include <QPixmap>
#include <QWheelEvent>

QtGuiApplication3::QtGuiApplication3(QWidget *parent)
	: QMainWindow(parent), scaleFactor(1.0)
{
	ui.setupUi(this);
	// 创建场景和视图
	scene = new QGraphicsScene(this);
	view = new QGraphicsView(scene, this);

	// 将视图嵌入到主窗口中
	setCentralWidget(view);

	// 加载图片并添加到场景
	QPixmap pixmap("E:/vs_prj/bmp/imag.jpg");  // 替换为实际图片路径
	scene->addPixmap(pixmap);

	// 设置拖动模式
	view->setDragMode(QGraphicsView::ScrollHandDrag);

	// 启用平滑缩放和反锯齿处理
	view->setRenderHint(QPainter::Antialiasing, true);
	view->setRenderHint(QPainter::SmoothPixmapTransform, true);

}

void QtGuiApplication3::wheelEvent(QWheelEvent* event)
{
	// 设置缩放因子
	const double scaleStep = 1.15;
	const double minScale = 0.1;
	const double maxScale = 10.0;

	// 获取当前鼠标在场景中的位置
	QPointF scenePos = view->mapToScene(event->pos());

	if (event->angleDelta().y() > 0) {
		// 鼠标向上滚动,放大
		if (scaleFactor < maxScale) {
			view->scale(scaleStep, scaleStep);
			scaleFactor *= scaleStep;
		}
	}
	else {
		// 鼠标向下滚动,缩小
		if (scaleFactor > minScale) {
			view->scale(1.0 / scaleStep, 1.0 / scaleStep);
			scaleFactor /= scaleStep;
		}
	}

	// 缩放后调整视图,确保以鼠标位置为中心缩放
	QPointF newScenePos = view->mapToScene(event->pos());
	QPointF delta = newScenePos - scenePos;
	view->translate(delta.x(), delta.y());
}

三、主函数保持不变

#include "QtGuiApplication3.h"
#include <QtWidgets/QApplication>

int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	QtGuiApplication3 w;
	w.show();
	return a.exec();
}

四、完整工程结构

确保 QtGuiApplication3 项目中包含以下文件:

  • QtGuiApplication3.h (头文件,定义 QGraphicsViewQGraphicsScene)
  • QtGuiApplication3.cpp (源文件,初始化场景、图片,并实现缩放和拖动)
  • QtGuiApplication3.ui (如果有界面设计文件)

五、运行效果

QT图片缩放效果


实现导入图片鼠标滑轮放缩和左键按住移动,可以使用QGraphicsView和QGraphicsScene来实现,具体步骤如下: 1. 创建一个QGraphicsView对象和QGraphicsScene对象,并将QGraphicsScene设置为QGraphicsView的场景。 2. 使用QGraphicsPixmapItem将图片添加到QGraphicsScene中。 3. 重写QGraphicsView的wheelEvent()方法,实现鼠标滑轮放缩图片的功能。 4. 重写QGraphicsView的mousePressEvent()、mouseMoveEvent()和mouseReleaseEvent()方法,实现鼠标左键按住移动图片的功能。 下面是一个简单的代码示例: ```python from PyQt5.QtWidgets import QGraphicsView, QGraphicsScene, QGraphicsPixmapItem from PyQt5.QtGui import QPixmap from PyQt5.QtCore import Qt class ImageViewer(QGraphicsView): def __init__(self, parent=None): super().__init__(parent) # 创建QGraphicsScene对象 self.scene = QGraphicsScene(self) self.setScene(self.scene) # 添加图片 self.image = QGraphicsPixmapItem() self.scene.addItem(self.image) # 设置滚动条策略 self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.setRenderHint(QPainter.Antialiasing, True) # 设置鼠标追踪 self.setMouseTracking(True) # 设置缩放比例 self.scaleFactor = 1.0 def loadImage(self, filename): # 加载图片 pixmap = QPixmap(filename) self.image.setPixmap(pixmap) self.setSceneRect(pixmap.rect()) def wheelEvent(self, event): # 放缩图片 if event.angleDelta().y() > 0: self.scaleFactor *= 1.1 else: self.scaleFactor /= 1.1 self.scale(self.scaleFactor, self.scaleFactor) def mousePressEvent(self, event): # 记录鼠标按下的位置 if event.button() == Qt.LeftButton: self.lastPos = event.pos() def mouseMoveEvent(self, event): # 移动图片 if event.buttons() & Qt.LeftButton: delta = event.pos() - self.lastPos self.lastPos = event.pos() self.translate(delta.x(), delta.y()) def mouseReleaseEvent(self, event): pass ``` 在上面的代码中,loadImage()方法用于加载图片,wheelEvent()方法用于放缩图片,mousePressEvent()、mouseMoveEvent()和mouseReleaseEvent()方法用于移动图片。注意,在mousePressEvent()方法中要记录鼠标按下的位置,在mouseMoveEvent()方法中要计算鼠标移动的距离,并将场景平移相应的距离。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值