QT QGraphicsView实现预览图片显示缩略图功能

QT QGraphicsView实现预览图片显示缩略图功能QT creator Qt5.15.2

头文件:

#ifndef TGRAPHICSVIEW_H
#define TGRAPHICSVIEW_H#include <QGraphicsView>
#include <QMainWindow>
#include <QObject>
#include <QWidget>class TGraphicsView : public QGraphicsView
{Q_OBJECT
public:TGraphicsView(QWidget *parent = 0);
private slots:void scrollBarValueChanged();private:void resizeEvent(QResizeEvent *event) override;void updateThumbRoi();struct PosInfo{int min;int max;int value;int page;};private:class Thumb;Thumb *thumb;
};
class TGraphicsView::Thumb : public QWidget
{Q_OBJECTpublic:using PosInfo = TGraphicsView::PosInfo;Thumb(QWidget* parent = 0);void updateImage();void updateRoi(const PosInfo& xinfo, const PosInfo& yinfo);private:void paintEvent(QPaintEvent *event) override;private:QPixmap background;QRect roi;
};#endif // TGRAPHICSVIEW_H

 cpp文件:

TGraphicsView::TGraphicsView(QWidget *parent) :QGraphicsView(parent)
{thumb = new Thumb(this);QScrollBar* hsb = horizontalScrollBar();connect(hsb, &QScrollBar::valueChanged, this, &TGraphicsView::scrollBarValueChanged);QScrollBar* vsb = verticalScrollBar();connect(vsb, &QScrollBar::valueChanged, this, &TGraphicsView::scrollBarValueChanged);}void TGraphicsView::resizeEvent(QResizeEvent *event)
{QGraphicsView::resizeEvent(event);thumb->updateImage();updateThumbRoi();
}void TGraphicsView::scrollBarValueChanged()
{updateThumbRoi();
}void TGraphicsView::updateThumbRoi()
{QScrollBar* hsb = horizontalScrollBar();PosInfo xinfo;xinfo.min = hsb->minimum();xinfo.max = hsb->maximum();xinfo.value = hsb->value();xinfo.page = hsb->pageStep();QScrollBar* vsb = verticalScrollBar();PosInfo yinfo;yinfo.min = vsb->minimum();yinfo.max = vsb->maximum();yinfo.value = vsb->value();yinfo.page = vsb->pageStep();thumb->updateRoi(xinfo, yinfo);
}/TGraphicsView::Thumb::Thumb(QWidget* parent) :QWidget(parent)
{setFixedSize(150, 150);
}void TGraphicsView::Thumb::paintEvent(QPaintEvent *)
{QPainter painter(this);painter.setOpacity(0.8);painter.fillRect(QRect(0, 0, width(), height()), QColor(255, 192, 32));int xoff = (width() - background.width()) / 2;int yoff = (height() - background.height()) / 2;painter.drawPixmap(xoff, yoff, background);/* 绘制ROI *///painter.setPen(QColor(32, 32, 32));painter.setPen(QColor(255, 0, 0));painter.setBrush(Qt::NoBrush);painter.drawRect(roi.adjusted(xoff, yoff, xoff, yoff));
}void TGraphicsView::Thumb::updateImage()
{QGraphicsView* view = dynamic_cast<QGraphicsView*>(parent());QRectF rect = view->sceneRect();qreal ratio = qMin(width() / rect.width(), height() / rect.height());background = QPixmap(rect.width() * ratio, rect.height() * ratio);QPainter painter(&background);QGraphicsScene* sc = view->scene();sc->render(&painter);update();
}void TGraphicsView::Thumb::updateRoi(const PosInfo& xinfo, const PosInfo& yinfo)
{int w = background.width();int xwhole = ((xinfo.max - xinfo.min) + xinfo.page);int roiLeft = w * xinfo.value / xwhole;int roiWidth = w * xinfo.page / xwhole;int h = background.height();int ywhole = ((yinfo.max - yinfo.min) + yinfo.page);int roiTop = h * yinfo.value / ywhole;int roiHeight = h * yinfo.page / ywhole;roi = QRect(roiLeft, roiTop, roiWidth, roiHeight);update();
}

工程代码:

https://download.csdn.net/download/txwtech/89700311

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/53167.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TCP的传输速度

如何确定TCP最大传输速度&#xff1f; TCP 的传输速度&#xff0c;受限于发送窗⼝&#xff0c;接收窗⼝以及⽹络设备传输能⼒。 其中&#xff0c;窗⼝⼤⼩由内核缓冲区⼤⼩决定。如果缓冲区与⽹络传输能⼒匹配&#xff0c;那么缓冲区的利⽤率就达到了最⼤化。 如何计算网络传…

vue transition组件

可能不生效的几个注意点 选择器的优先级谨慎合并样式 显示三阶段和隐藏三阶段的class名 1、vue2中显示的初始阶段类名是&#xff1a;v-enter&#xff1b;隐藏的初始阶段类名是&#xff1a;v-leave2、v-enter-active、v-leave-active这两个 class 可以被用来定义动画的持续时间…

设计模式1:C#开发中使用创建型的工厂模式和行为型的策略模式

一、接口设计的好处 三大好处&#xff1a;解耦、可复用、可扩展。 二、简单工厂模式 【三要素】能创建具体产品的工厂、抽象产品&#xff08;接口&#xff09;、具体产品 【基本用法】字符串>创建对象>调用其方法 // 产品接口 public interface IProduct {void Opera…

应用开发---VTK放大镜(区域放大)功能实现

VTK 医学图像处理---放大镜/区域放大功能 本博文主要内容为:实现放大镜的源代码;实现思路;具体代码说明。 目录 VTK 医学图像处理---放大镜/区域放大功能 简介: 1 放大镜源代码 1 wxInteractorStyleImage 类源代码 2 wxMagnifierAcotor类源代码 3 Magnifier.cpp 源…

速盾:低成本防御DDoS最佳方案是高防cdn吗?

随着互联网的快速发展&#xff0c;网络攻击也变得越来越普遍和严重。分布式拒绝服务攻击&#xff08;DDoS&#xff09;是一种常见的网络攻击方式&#xff0c;它利用大量的请求来淹没目标服务器&#xff0c;使其无法正常工作。为了保护服务器免受DDoS攻击的影响&#xff0c;使用…

2024高教杯数学建模A题思路

问题1:舞龙队沿螺距为55 cm 的等距螺线顺时针盘入 分析: 龙头速度:龙头前把手的行进速度始终保持1 m/s。螺线参数:螺距为55 cm,即0.55 m。初始条件:龙头位于螺线第16圈A点处。思路: 确定螺线方程:根据螺线的性质,建立极坐标方程,表示螺线各点的位置。计算时间步长:…

Android 打开 GBK项目如何设置成UTF-8

1.标题 今天打开一个eclipse老项目&#xff0c;编码格式为GBK&#xff0c;Android studio导入项目报错&#xff0c;本人想到一个方案就是批量修改文件格式从 GBK到 UTF-8&#xff0c;这样可以一键解决问题 2.开发脚本 使用前请备份代码 使用前请备份代码 使用前请备份代码…

构建STM32智能平衡车项目:PID控制算法与蓝牙通信技术

一、项目概述 项目目标和用途 本项目旨在设计和实现一款基于STM32单片机的平衡车。平衡车是一种新型的个人交通工具&#xff0c;广泛应用于短途出行、休闲娱乐等场景。通过本项目&#xff0c;我们希望能够实现一款具备良好稳定性和操控性的平衡车&#xff0c;能够在不同的地形…

vue-组件传值总结

Vue.js中实现组件间传值的方法有多种。以下是几种常见的传值方式的详细讲解和示例&#xff1a; 1.父组件向子组件传值&#xff08;props&#xff09; 父组件通过props向子组件传递数据&#xff0c;子组件可以接收并使用这些数据。当父组件重新渲染时&#xff0c;数据会被覆盖…

Python Opencv鼠标回调

使用 OpenCV 的 cv2.setMouseCallback() 方法来捕捉鼠标事件&#xff0c;并实现以下功能&#xff1a; 实时在鼠标指针附近显示其位置的像素坐标。通过左键双击&#xff0c;将像素坐标记录到数组中。通过右键点击&#xff0c;取消上一次添加的坐标。 下面是实现代码的示例&…

NLP从零开始------文本中阶处理之序列到序列模型(完整版)

1. 序列到序列模型简介 序列到序列( sequence to sequence, seq2seq) 是指输入和输出各为一个序列(如一句话) 的任务。本节将输入序列称作源序列&#xff0c;输出序列称作目标序列。序列到序列有非常多的重要应用&#xff0c; 其中最有名的是机器翻译( machine translation), 机…

WebRTC协议下的视频汇聚融合技术:EasyCVR视频技术构建高效视频交互体验

视频汇聚融合技术是指将来自不同源、不同格式、不同网络环境的视频流进行集中处理、整合和展示的技术。随着视频监控、远程会议、在线教育、直播娱乐等领域的快速发展&#xff0c;视频数据的规模急剧增长&#xff0c;对视频处理能力和效率提出了更高要求。视频汇聚融合技术通过…

思科IP访问控制列表3

#网络安全技术实现# #任务三扩展访问控制列表的控制3# #1配置计算机的IP 地址、子网掩码和网关 #2配置Switch-A的主机名称&#xff0c;创建vlan 10,20,30,并将Fa0/1划入vlan 10&#xff0c;Fa0/2划入vlan 20&#xff0c;G0/1划入vlan 30 Switch(config)#hostname Switch-A S…

「OC」iOS事件处理流程

「OC」初识iOS事件处理流程 文章目录 「OC」初识iOS事件处理流程触摸事件触摸事件的响应周期事件 响应者UIEventUITouchUIResponder 触摸流程系统响应阶段APP响应阶段寻找最佳响应者 构成响应链 寻找最佳响应者和响应链的区别总结参考资料 触摸事件 iOS的事件有好几种&#xf…

DriveLM的baseline复现

DriveLM是一篇很有意思的工作&#xff0c;把自动驾驶跟MLLM结合到一起了&#xff0c;实现端到端的感知or决策规划。 Repo&#xff1a;https://github.com/OpenDriveLab/DriveLM 该工作是基于nuScenes数据集做的&#xff0c;官方paper里给出了数据的具体构建方式&#xff0c;感…

ElasticSearch-关联关系

Elasticsearch并不擅长处理关联关系&#xff0c;一般会采用以下四种方法处理关联 对象类型嵌套对象 (Nested Object)父子关联关系 (Parent / Child)应用端关联 对象类型 在每一博客的文档中都保留作者的信息 如果作者信息发生变化&#xff0c;需要修改相关的博客文档 包含对象…

SpringBoot依赖之Spring Boot DevTools热部署开发增效工具

摘要&#xff1a;Spring项目又大又重&#xff0c;依赖多&#xff0c;编译启动慢&#xff0c;怎么提高研发效率呢&#xff1f;方法之一热部署&#xff01; 概念 Spring Boot DevTools 依赖名称: Spring Boot DevTools功能描述: Provides fast application restarts, LiveRelo…

softmax里边的exp用拟合验证精度。

文章目录 要验证Softmax函数中的指数运算&#xff08;exp函数&#xff09;对精度的影响&#xff0c;可以通过拟合一个函数来近似Softmax函数&#xff0c;并比较两者的输出结果。 import numpy as np import matplotlib.pyplot as plt# Softmax函数 def softmax(x):e_x np.exp…

25k的自动化测试面试题,原来都是这样~

小编热衷于收集整理资源&#xff0c;记录踩坑到爬坑的过程。希望能把自己所学&#xff0c;实际工作中使用的技术、学习方法、心得及踩过的一些坑&#xff0c;记录下来。也希望想做软件测试的你一样&#xff0c;通过我的分享可以少走一些弯路&#xff0c;可以形成一套自己的方法…

AI绘画时代的自媒体引流攻略:如何实现粉丝暴涨与盈利

一、AI绘画在自媒体引流和赚钱中的应用 创作独特视觉内容&#xff0c;吸引粉丝关注 AI绘画技术可以帮助自媒体从业者创作出独一无二的视觉内容&#xff0c;这些内容在社交媒体上具有很高的辨识度和吸引力。通过以下方式&#xff0c;AI绘画助力引流和赚钱&#xff1a; &#xf…