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

免责声明:

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

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

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

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


前言

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


一、定义QGraphicsView和QGraphicsView

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

#pragma once

#include 
#include "ui_QtGuiApplication3.h"
#include 
#include 




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 
#include 

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 

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图片缩放效果


你可能感兴趣的:(QT,fpga开发,qt)