Qt 实现橡皮擦拭显示图片

news2024/10/6 10:29:37

1.简介

在一些游戏中看见类似解密破案的效果,使用手触摸去擦拭图片上的灰尘,然后显示最终的图片,所以也想试试Qt实现的效果。大家有自己想做的效果,都可以尝试。

以下是效果展示图。

可以控制橡皮擦的大小,进行擦拭。

2.原理

鼠标按住,然后移动,不断的给移动的圆形区域设置像素点的值,显示图片。

源码:

#include "wipewidget.h"
#include "ui_wipewidget.h"
#include <QDebug>

WipeWidget::WipeWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::WipeWidget)
{
    ui->setupUi(this);

    setMouseTracking(true);
}

WipeWidget::~WipeWidget()
{
    delete ui;
}

void WipeWidget::setEraserSize(int size)
{
    m_eraserSize = size;
    m_point = QPoint(this->width()/2,this->height()/2);

    update();
}

void WipeWidget::paintEvent(QPaintEvent *e)
{
    Q_UNUSED(e);
    //画圆圈
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing, true); // 启用抗锯齿
    painter.drawImage(0,0,m_image);

    QPen pen;
    pen.setWidth(2);
    pen.setColor(Qt::white);
    painter.setPen(pen);

    qDebug()<<"";
    painter.drawEllipse(m_point,m_eraserSize,m_eraserSize);

    if(m_isMousePressed)
        setImage(m_point);
}

void WipeWidget::mousePressEvent(QMouseEvent *event)
{
    m_isMousePressed = true;
}

void WipeWidget::mouseReleaseEvent(QMouseEvent *event)
{
    Q_UNUSED(event);
    m_isMousePressed = false;
}

void WipeWidget::mouseMoveEvent(QMouseEvent *event)
{
    m_point = event->pos();
    update();
}

void WipeWidget::showEvent(QShowEvent *event)
{
    Q_UNUSED(event);
    if(m_isInit)
       return;

    m_isInit = true;
    m_srcImage = QImage("./demo.jpeg").scaled(this->width(),this->height());
    m_image = QImage(m_srcImage.width(),m_srcImage.height(),m_srcImage.format());
}

void WipeWidget::setImage(QPoint point)
{
    int centerX = point.x();
    int centerY = point.y();

    if(centerX > m_srcImage.width() ||
       centerY > m_srcImage.height())
        return;

    int radius = m_eraserSize;

    for (int x = qMax(centerX - radius,0);
         x < qMin(centerX + radius,m_srcImage.width()); x++)
    {
        for (int y = qMax(centerY - radius,0);
             y < qMin(centerY + radius,m_srcImage.height()); y++)
        {
            if ((x - centerX) * (x - centerX) + (y - centerY) * (y - centerY) <= radius * radius)
            {
                if(x <= m_srcImage.width() && m_srcImage.height()-y <= m_srcImage.height())
                {
                    m_image.setPixel(x,y,m_srcImage.pixel(x, y));
                }
            }
        }
    }
}

3.完整工程

https://download.csdn.net/download/wzz953200463/88906763

4.相关推荐

1.圆形进度条实现

2.麦克风音量大小模拟

3.自定义时钟

4.自定义长条进度条

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

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

相关文章

nginx 配置404 及 nginx demo

郭永坤123/nginx-demo nginx demo&#xff1a; 包含 &#xff1a; 负载均衡 自定义conf 反向代理

基于Springboot的助农管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的助农管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

Linux系统使用宝塔面板安装MySQL服务并实现公网远程访问本地数据库【内网穿透】

文章目录 前言1.Mysql服务安装2.创建数据库3.安装cpolar3.2 创建HTTP隧道 4.远程连接5.固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 宝塔面板的简易操作性,使得运维难度降低,简化了Linux命令行进行繁琐的配置,下面简单几步,通过宝塔面板cp…

typedef定义结构体--声明结构体变量--指向该类型的指针

// 结构体指针.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // //#define _CRT_SECURE_NO_WARNINGS //在C或C程序中&#xff0c;#define _CRT_SECURE_NO_WARNINGS 是一个预处理指令&#xff0c; //用于在编译时禁止特定的安全警告。这些警告通常与使…

#QT(程序打包)

1.IDE&#xff1a;QTCreator 2.实验&#xff1a;打包到windows&#xff08;exe文件&#xff09; 3.记录&#xff1a; &#xff08;1&#xff09;切换工厂到"release"&#xff0c;release模式基本没有调试信息&#xff0c;比较精简&#xff0c;debug模式有很多调试信…

第1章:绪论 1.1数据库系统概述

文章目录 1.1 数据库系统概述1.1.1 数据库的4个基本概念1.1.2 数据管理技术的产生和发展1.1.3 数据库系统的特点 1.1 数据库系统概述 1.1.1 数据库的4个基本概念 数据(Data) 是数据库中存储的基本对象 数据的定义&#xff1a;描述事物的符号记录 数据的种类&#xff1a;文本、…

京津冀光伏展

京津冀光伏展是中国在京津冀地区举办的一项光伏产业展览活动。该展览旨在展示京津冀地区光伏产业的最新发展成果&#xff0c;促进光伏行业的交流与合作&#xff0c;推动光伏产业的可持续发展。 光伏产业是指利用太阳能将光能转化为电能的产业。作为一种清洁能源&#xff0c;光伏…

文章置顶功能的测试用例应该怎么写?

写文章置顶功能的测试用例时&#xff0c;可以考虑以下几个方面&#xff1a; 一、基本功能测试&#xff1a; 检查是否能够成功将文章置顶。 验证置顶后的文章是否显示在顶部位置。 测试取消置顶功能是否正常。 二、多种状态测试&#xff1a; 置顶一篇已发布的文章。 置顶一篇…

opencart3 添加速卖通商品脚本

非爬虫&#xff0c;只能把速卖通商品信息拿下来解析插入到自己的项目里。 刚接触opencart3没多久&#xff0c;有一些新项目需要添加商品&#xff0c;每次手动从速卖通复制信息又很慢&#xff0c;就自己写了一个脚本。 思路&#xff1a;速卖通商品详情页有一段数据包含了几乎所…

5分钟速成渐变色css

色彩的分支——渐变色定义&#xff1a;按照一定规律做阶段性变化的色彩&#xff08;抽象&#xff01;&#xff01;&#xff01;&#xff09; 我们可以将图片分为两块 以中心线为参考&#xff0c;再来看渐变色的定义&#xff1a;按照一定规律做阶段性变化的色彩 既然是按一定的…

韦斯尔顿公爵以自己的方式登上顶峰!迪士尼新机器人出圈!

文 | BFT机器人 去年12月&#xff0c;迪士尼推出的最新机器人角色韦瑟尔顿公爵&#xff08;Duke Weaselton&#xff09;首次登上上海迪士尼度假区的舞台。Duke 是华特迪士尼幻想工程研发 (R&D) 和迪士尼研究中心下一代机器人技术的演示。通过杜克&#xff0c;我们能看到各…

奥维云网:森歌智能水洗集成灶开启集成灶4.0时代

新的一个商业“竞争年”正式到来。厨电集成灶行业率先发力。2曰27日&#xff0c;森歌以“勠力同心&#xff0c;共生共歌”为主题召开了盛大的全国优秀经销商峰会&#xff0c;并在峰会上一连发布了三个重磅消息&#xff0c;被视为集成灶行业的破冰行动&#xff01; 从国家统计局…

【Python】进阶学习:pandas--info()用法详解

【Python】进阶学习&#xff1a;pandas–info()用法详解 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到您的订…

模拟信号转换光电隔离变送器导轨式0-75mV0-100mV0-50mV转4-20mA0-5V0-10V

概述&#xff1a; 导轨安装DIN11 IPO OC系列模拟信号隔离放大器是一种将输入信号隔离放大、转换成按比例输出的直流信号混合集成厚模电路。产品广泛应用在电力、远程监控、仪器仪表、医疗设备、工业自控等需要直流信号隔离测控的行业。此系列产品内部采用了线性光电隔离技术相…

鸿蒙 Stage模型-应用组件-配置、UIAbility

前提&#xff1a;基于官网3.1/4.0文档。参考官网文档 基于Android开发体系来进行比较和思考。&#xff08;或有偏颇&#xff0c;自行斟酌&#xff09; 一、概念 可以看到分为运行期、编译器&#xff0c;主要关注UIAbility&#xff08;类似Activity&#xff0c;UI相关&#xff0…

【C++】list模拟实现+反向迭代器

list模拟实现 list定义list用法list iterator的使用begin() end()rbegin()rend() reverse()sort()merge()unique()remove()splice() list模拟实现struct和class的区别list三个类模板默认成员函数构造函数拷贝构造函数赋值运算符重载析构函数 数据修改操作push_back()push_fron…

探索数据之美:山海鲸可视化软件的五大核心组件解析

作为一名数据分析师&#xff0c;我们每天都在与海量的数据打交道。如何将这些看似杂乱无章的数据转化为有价值的信息&#xff0c;进而为决策提供支持&#xff0c;是我们的核心任务。在这个过程中&#xff0c;可视化工具扮演着至关重要的角色。我日常使用的是山海鲸可视化软件&a…

TCPDump 使用教程

每次服务器网络不通的时候&#xff0c;总会听到一个声音&#xff0c;你去抓包啊&#xff0c;那这里就来介绍下TCPDump&#xff0c;一款强大的网络分析工具&#xff0c;可以捕获网络上的数据包&#xff0c;并进行分析。这款工具在网络管理员和安全专家中非常受欢迎。 一、安装 …

LiveGBS流媒体平台GB/T28181功能-集中录像存储前端设备录像回看解决方案设备录像|云端录像|实时录像说明

LiveGBS集中录像存储前端设备录像回看解决方案设备录像|云端录像|实时录像说明 1、平台概述2、视频录像2.1、设备录像2.1.1、存储位置2.1.1.1、下级硬件设备2.1.1.2、下级国标平台 2.1.2、页面操作2.1.2.1、国标设备2.1.2.1.1、查看通道2.1.2.1.1.1、设备录像 2.1.2.1.2、配置中…

Scrapy与分布式开发(2.3):lxml+xpath基本指令和提取方法详解

lxmlxpath基本指令和提取方法详解 一、XPath简介 XPath&#xff0c;全称为XML Path Language&#xff0c;是一种在XML文档中查找信息的语言。它允许用户通过简单的路径表达式在XML文档中进行导航。XPath不仅适用于XML&#xff0c;还常用于处理HTML文档。 二、基本指令和提取…