免责声明:
本文所提供的信息和内容仅供参考。作者对本文内容的准确性、完整性、及时性或适用性不作任何明示或暗示的保证。在任何情况下,作者不对因使用本文内容而导致的任何直接或间接损失承担责任,包括但不限于数据丢失、业务中断或其他经济损失。
读者在使用本文信息时,应自行验证其准确性和适用性,并对其使用结果负责。本文内容不构成专业技术咨询或建议,具体的技术实现和应用应根据实际情况和需要进行详细分析和验证。
本文所涉及的任何商标、版权或其他知识产权均属于其各自的所有者。若本文中引用了第三方的资料或信息,引用仅为学术交流目的,不构成对第三方内容的认可或保证。
若有任何疑问或需进一步信息,请联系本文作者或相关专业人士。
前言
作为FPGA开发者,在调试图像处理时,通常需要将上位机接收到的图像进行显示。然而,显示器的分辨率可能无法与图像的原始分辨率匹配,这时就需要对图像进行缩放处理。Qt 提供了现成的库,QGraphicsView 能轻松实现图像的缩放、鼠标拖动移动,以及通过鼠标点击位置实现放大缩小等功能,帮助开发者高效地进行图像调试和可视化操作。
一、定义QGraphicsView和QGraphicsView
首先,更新你的 QtGuiApplication
类,使其包含 QGraphicsView
和 QGraphicsScene
,并重写 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
(头文件,定义QGraphicsView
和QGraphicsScene
)QtGuiApplication3.cpp
(源文件,初始化场景、图片,并实现缩放和拖动)QtGuiApplication3.ui
(如果有界面设计文件)
五、运行效果
QT图片缩放效果