当前位置: 首页 > ops >正文

Qt Demo(3) 之 deepseek 帮我写的关于图像显示的小界面

Qt Demo(3) 之 deepseek 帮我写的关于图像显示的小界面

  • 一个完整的图像浏览器实现,支持缩放、拖拽和坐标显示功能。
  • 实现提供了一个功能完整、界面美观的图像浏览器,展示了 QGraphicsView、QGraphicsScene 和 QGraphicsPixmapItem 的核心功能和使用方法。
  • 界面如下图所示:

在这里插入图片描述

界面功能介绍

在这里插入图片描述

  • 关键实现细节

在这里插入图片描述

具体实现代码

  • imageviewer.h
#ifndef IMAGEVIEWER_H
#define IMAGEVIEWER_H#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsPixmapItem>
#include <QWheelEvent>
#include <QMouseEvent>
#include <QPointF>class ImageViewer : public QGraphicsView
{Q_OBJECTpublic:explicit ImageViewer(QWidget* parent = nullptr);// 图像操作bool loadImage(const QString& fileName);void setImage(QImage& qimage);void clearImage();// 视图操作void zoomIn();void zoomOut();void resetView();void fitToWindow();// 获取当前状态bool hasImage() const;double scaleFactor() const;signals:// 坐标变化信号void mousePositionChanged(const QPointF& scenePos);protected:// 事件处理void wheelEvent(QWheelEvent* event) override;void mousePressEvent(QMouseEvent* event) override;void mouseMoveEvent(QMouseEvent* event) override;void mouseReleaseEvent(QMouseEvent* event) override;private:// 初始化设置void setupView();// 缩放控制void scaleView(double factor);// 成员变量QGraphicsScene* scene;QGraphicsPixmapItem* pixmapItem;double currentScale;bool isDragging;QPoint lastDragPos;
};#endif // IMAGEVIEWER_H
  • imageviewer.cpp
#include "imageviewer.h"
#include <QGraphicsScene>
#include <QGraphicsPixmapItem>
#include <QWheelEvent>
#include <QMouseEvent>
#include <QFileDialog>
#include <QMessageBox>
#include <QScrollBar>
#include <QtMath>ImageViewer::ImageViewer(QWidget* parent): QGraphicsView(parent), scene(nullptr), pixmapItem(nullptr),currentScale(1.0), isDragging(false)
{// 创建场景scene = new QGraphicsScene(this);setScene(scene);// 设置视图属性setupView();
}void ImageViewer::setupView()
{// 设置渲染提示setRenderHint(QPainter::Antialiasing, true);setRenderHint(QPainter::SmoothPixmapTransform, true);setRenderHint(QPainter::TextAntialiasing, true);// 设置视图属性setDragMode(QGraphicsView::ScrollHandDrag);setTransformationAnchor(QGraphicsView::AnchorUnderMouse);setResizeAnchor(QGraphicsView::AnchorUnderMouse);setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);setFrameShape(QFrame::NoFrame);// 设置背景setBackgroundBrush(QBrush(QColor(50, 50, 50)));
}bool ImageViewer::loadImage(const QString& fileName)
{// 加载图像QPixmap pixmap(fileName);if (pixmap.isNull()) {return false;}// 清除现有内容clearImage();// 创建新的图像项pixmapItem = scene->addPixmap(pixmap);scene->setSceneRect(pixmap.rect());// 重置视图resetView();return true;
}void ImageViewer::setImage(QImage& qimage)
{// 清除现有内容clearImage();QPixmap pixmap = QPixmap::fromImage(qimage);// 创建新的图像项pixmapItem = scene->addPixmap(pixmap);scene->setSceneRect(pixmap.rect());// 重置视图resetView();
}void ImageViewer::clearImage()
{// 清除场景scene->clear();pixmapItem = nullptr;currentScale = 1.0;
}void ImageViewer::zoomIn()
{scaleView(1.2);
}void ImageViewer::zoomOut()
{scaleView(1.0 / 1.2);
}void ImageViewer::resetView()
{// 重置变换//resetTransform();fitToWindow();currentScale = 1.0;// 如果存在图像,居中显示if (pixmapItem) {centerOn(pixmapItem);}
}void ImageViewer::fitToWindow()
{if (pixmapItem) {// 适应窗口大小fitInView(scene->sceneRect(), Qt::KeepAspectRatio);// 更新当前缩放比例QTransform transform = this->transform();currentScale = transform.m11();}
}bool ImageViewer::hasImage() const
{return pixmapItem != nullptr;
}double ImageViewer::scaleFactor() const
{return currentScale;
}void ImageViewer::scaleView(double factor)
{// 应用缩放scale(factor, factor);currentScale *= factor;
}void ImageViewer::wheelEvent(QWheelEvent* event)
{if (pixmapItem) {// 计算缩放因子double factor = qPow(1.2, event->angleDelta().y() / 240.0);scaleView(factor);event->accept();}else {QGraphicsView::wheelEvent(event);}
}void ImageViewer::mousePressEvent(QMouseEvent* event)
{if (event->button() == Qt::LeftButton && pixmapItem) {// 开始拖拽setCursor(Qt::ClosedHandCursor);lastDragPos = event->pos();isDragging = true;event->accept();}else {QGraphicsView::mousePressEvent(event);}
}void ImageViewer::mouseMoveEvent(QMouseEvent* event)
{if (pixmapItem) {// 获取场景坐标QPointF scenePos = mapToScene(event->pos());// 发射坐标变化信号emit mousePositionChanged(scenePos);// 处理拖拽if (isDragging && (event->buttons() & Qt::LeftButton)) {// 计算移动距离QPoint delta = event->pos() - lastDragPos;lastDragPos = event->pos();// 移动滚动条horizontalScrollBar()->setValue(horizontalScrollBar()->value() - delta.x());verticalScrollBar()->setValue(verticalScrollBar()->value() - delta.y());event->accept();}else {QGraphicsView::mouseMoveEvent(event);}}else {QGraphicsView::mouseMoveEvent(event);}
}void ImageViewer::mouseReleaseEvent(QMouseEvent* event)
{if (event->button() == Qt::LeftButton && isDragging) {// 结束拖拽setCursor(Qt::ArrowCursor);isDragging = false;event->accept();}else {QGraphicsView::mouseReleaseEvent(event);}
}
  • mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QStatusBar>
#include <QLabel>
#include "imageviewer.h"class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget* parent = nullptr);~MainWindow();private slots:void openImage();void updateStatusBar(const QPointF& scenePos);private:void setupUI();void setupConnections();ImageViewer* imageViewer;  //图像显示QStatusBar* statusBar;    //状态栏QLabel* coordLabel;     //显示坐标QLabel* scaleLabel;     //显示缩放尺度// 工具栏动作QAction* openAction;      //打开图像QAction* zoomInAction;    //缩小QAction* zoomOutAction;   //放大QAction* resetViewAction; //恢复视野QAction* fitToWindowAction;   //适应窗口大小
};#endif // MAINWINDOW_H
  • mainwindow.cpp
#include "mainwindow.h"
#include <QToolBar>
#include <QFileDialog>
#include <QMessageBox>MainWindow::MainWindow(QWidget* parent): QMainWindow(parent)
{setupUI();setupConnections();setWindowTitle("Image Browser");resize(1000, 700);
}MainWindow::~MainWindow()
{
}void MainWindow::setupUI()
{// 创建图像查看器imageViewer = new ImageViewer(this);setCentralWidget(imageViewer);// 创建状态栏statusBar = new QStatusBar();setStatusBar(statusBar);coordLabel = new QLabel("Coordinates: (0, 0)");scaleLabel = new QLabel("Scale: 100%");statusBar->addPermanentWidget(coordLabel);statusBar->addPermanentWidget(scaleLabel);// 创建工具栏QToolBar* toolBar = new QToolBar("Main Toolbar");addToolBar(Qt::TopToolBarArea, toolBar);// 创建动作openAction = new QAction("Open", this);zoomInAction = new QAction("Zoom In", this);zoomOutAction = new QAction("Zoom Out", this);resetViewAction = new QAction("Reset View", this);fitToWindowAction = new QAction("Fit to Window", this);// 添加到工具栏toolBar->addAction(openAction);toolBar->addAction(zoomInAction);toolBar->addAction(zoomOutAction);toolBar->addAction(resetViewAction);toolBar->addAction(fitToWindowAction);// 设置样式setStyleSheet(R"(QMainWindow {background-color: #2b2b2b;}QToolBar {background-color: #3c3c3c;color: #ffffff;border: none;spacing: 3px;padding: 3px;}QToolButton {background-color: #4c4c4c;color: #ffffff;border: 1px solid #5c5c5c;border-radius: 3px;padding: 5px;}QToolButton:hover {background-color: #5c5c5c;}QStatusBar {background-color: #3c3c3c;color: #ffffff;}QLabel {color: #ffffff;})");
}void MainWindow::setupConnections()
{connect(openAction, &QAction::triggered, this, &MainWindow::openImage);connect(zoomInAction, &QAction::triggered, imageViewer, &ImageViewer::zoomIn);connect(zoomOutAction, &QAction::triggered, imageViewer, &ImageViewer::zoomOut);connect(resetViewAction, &QAction::triggered, imageViewer, &ImageViewer::resetView);connect(fitToWindowAction, &QAction::triggered, imageViewer, &ImageViewer::fitToWindow);connect(imageViewer, &ImageViewer::mousePositionChanged, this, &MainWindow::updateStatusBar);
}void MainWindow::openImage()
{QString fileName = QFileDialog::getOpenFileName(this,"Open Image", "", "Image Files (*.png *.jpg *.jpeg *.bmp *.tif)");if (!fileName.isEmpty()){// 加载图像QImage qimage(fileName);if (qimage.isNull()) {QMessageBox::warning(this, "Error", "Cannot load image file.");}else {imageViewer->setImage(qimage);}/* if (!imageViewer->loadImage(fileName)) {QMessageBox::warning(this, "Error", "Cannot load image file.");}*/}
}void MainWindow::updateStatusBar(const QPointF& scenePos)
{// 更新坐标显示coordLabel->setText(QString("Coordinates: (%1, %2)").arg(scenePos.x()).arg(scenePos.y()));// 更新缩放比例显示int scalePercent = static_cast<int>(imageViewer->scaleFactor() * 100);scaleLabel->setText(QString("Scale: %1%").arg(scalePercent));
}
  • main.cpp
#include "mainwindow.h"
#include <QApplication>int main(int argc, char* argv[])
{QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}
http://www.xdnf.cn/news/19609.html

相关文章:

  • 【Vue2 ✨】Vue2 入门之旅(十):Vuex 入门
  • 精读:《VideoMAE V2: Scaling Video Masked Autoencoders with Dual Masking》
  • 一键换装玩疯了!3个AI魔法提示词让你秒变时尚达人
  • lua脚本在redis中执行是否是原子性?
  • Java反序列化漏洞揭秘:从原理到攻击实战
  • RT-DETR模型训练中断,接着训练的方法
  • 单片机day1
  • DevExpress WPF中文教程:如何将WPF数据网格绑定到本地数据库?
  • MyBatis:让 SQL 与代码和谐共处的持久层框架
  • Windows 和 Linux 服务器 IP 与域名强制绑定方法
  • Python上下文管理器:资源管理的隐形守护者
  • 灵神题单之链表、树
  • k8s的CRD自定义资源类型示例
  • 整体认识K8s之PriorityClass优先级调度/HPA自动扩缩容机制
  • 【设计模式】从游戏角度开始了解设计模式 --- 创建型模式(一)
  • 【Linux系统】万字解析,进程间的信号
  • Photoshop用户必看:让你的PSD像JPG一样可预览
  • 书写腾讯天气遇到的问题
  • 虚拟继承:破解菱形继承之谜
  • 【论文阅读】Deepseek-VL:走向现实世界的视觉语言理解
  • Postman接口测试工具:高效管理测试用例与环境变量,支持断言验证及团队协作同步
  • 软件设计师——软件工程学习笔记
  • 前端架构知识体系:常见压缩算法全解析及原理揭秘(gzip、zip)
  • 麒麟信安受邀出席第三届电子信息测试产业大会,参编四项团标发布,详解麒麟信安操作系统测试全流程
  • Navicat vs DBeaver vs DataGrip:三款主流数据库客户端深度对比与选择
  • 力扣222 代码随想录Day15 第四题
  • 【高并发内存池】三、线程缓存的设计
  • Steam开发者上架游戏完整指南(含具体技术细节)
  • 【最新Pr 2025安装包(Adobe Premiere Pro 2025 中文解锁版)安装包永久免费版下载安装教程】
  • Java-Spring入门指南(一)Spring简介