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

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.dtcms.com/a/363493.html

相关文章:

  • 漫画短剧小程序系统开发:从0到1的核心架构与思路
  • Redis 缓存雪崩实战:从监控告警到3层防护的完整修复
  • 【读论文】美团开源MOE大模型LongCat-Flash
  • Pod自动重启问题排查:JDK 17 EA版本G1GC Bug导致的应用崩溃
  • 线上排查bug的命令
  • 企业微信员工聊天记录能看吗?合规管理三要素一次性说清
  • 企业微信怎么用能高效获客?拆解体检品牌如何实现私域营收提升
  • Windows 和 Linux 服务器 IP 与域名强制绑定方法
  • Zabbix7代理方式监控oracle 23.3
  • C++多线程编程:std::thread, std::async, std::future
  • PHP 8.x与现代Web开发:性能、安全与生态进化
  • 数据库入门实战版
  • 深度学习篇---SGD优化器
  • Java反序列化漏洞揭秘:从原理到攻击实战
  • RabbitMQ消息堆积问题排查:concurrentConsumers 配置的坑与解决方案
  • 网络共享协议
  • 探索JavaScript机器学习:几款流行的库推荐
  • 服务器数据恢复—OceanStor存储数据丢失原来这样恢复
  • linux 命令 awk的常见用法
  • 【LeetCode】3025. 人员站位的方案数 I(康复-T2)
  • 【ComfyUI】SDXL Refiner 提示进一步提升生成图像的质量
  • 族 20 魅族 note16 meizu M20 MEIZU NOTE16 解锁BL bootloader
  • Linux电脑怎样投屏到客厅的大电视?支持远程投屏吗?
  • 构建高性能企业级搜索?Amazon CloudSearch全攻略:从核心概念到落地实践
  • 第 2 讲:Kafka Topic 与 Partition 基础
  • 心路历程-vim编辑器
  • 详解kafka streams(二)
  • Kafka 架构详解
  • 数据结构_队列(C语言实现)
  • 图论简介与图神经网络(Dijkstra算法,图卷积网络GCN实战)