QT之头像剪裁效果实现

article/2025/6/28 11:56:56

文章目录

  • 源码地址,环境:QT5.15,MinGW32位
  • 效果演示
  • 导入图片
  • 设置剪裁区域
  • 创建剪裁小窗口
  • 重写剪裁小窗口的鼠标事件
    • mousePressEvent
    • mouseMoveEvent
    • mouseReleaseEvent
  • 小窗口移动触发父窗口的重绘事件
  • 剪裁效果实现

源码地址,环境:QT5.15,MinGW32位

效果演示

在这里插入图片描述
在这里插入图片描述

导入图片

    QPixmap m_srcPix;QPixmap m_scaledPix;//从文件导入图片m_srcPix.load("D:\\Jolly\\A_0voice_chat\\chapter_explanation\\PictureEdit_demo\\PictureEdit\\images\\1.png");//把导入的图片截取到窗口大小m_scaledPix = m_srcPix.scaled(ui->label->width(), ui->label->height());//在窗口显示图片ui->label->setPixmap(m_scaledPix);

设置剪裁区域

    //裁剪头像活动窗口//设置透明this->setWindowFlags(Qt::FramelessWindowHint);//设置矩形区域,整个窗口this->setGeometry(0, 0, parentWidget()->width(), parentWidget()->height());CutDialog *m_cutDialog;//头像剪切窗口m_cutDialog = new CutDialog(this);m_cutDialog->show();

创建剪裁小窗口

CutDialog::CutDialog(QWidget *parent) :QWidget(parent)
{setGeometry(0,0, 150, 150);m_mouseDown = false;
}

重写剪裁小窗口的鼠标事件

mousePressEvent

void CutDialog::mousePressEvent(QMouseEvent *event)
{//获取鼠标按下时的位置m_startPoint = event->pos();//判断按下的是否是鼠标左键m_mouseDown = event->button() == Qt::LeftButton;
}

mouseMoveEvent

要是没有启用鼠标追踪,mouseMoveEvent 只有在鼠标按键被按下并且鼠标移动时才会触发,而且是在mousePressEvent触发之后。
当启用鼠标追踪后,不管鼠标按键是否被按下,只要鼠标移动,mouseMoveEvent就会触发

void CutDialog::mouseMoveEvent(QMouseEvent *event)
{//获取鼠标移动以后的位置QPoint dragPoint = event->pos();if (m_mouseDown) {//pos保存小部件在其父部件中的位置QPoint p = QPoint(//pos() 是对话框在父窗口中的左上角坐标//dragPoint - m_startPoint 计算鼠标移动的偏移量//原理: 拖动点相对于对话框的位置保持不变(如从(10,10)点开始拖动,移动后仍抓住该点)pos().x()+dragPoint.x() - m_startPoint.x(), // 水平方向pos().y()+dragPoint.y()-m_startPoint.y()    // 垂直方向);QPoint dragEndge = p;dragEndge.setX(p.x() + rect().width());   // 对话框右下角X坐标dragEndge.setY(p.y() + rect().height());  // 对话框右下角Y坐标//左上角约束,保证小窗口左上角在父窗口范围内p.setX(p.x() < 0 ? 0 : p.x());p.setY(p.y() < 0 ? 0 : p.y());//右下角约束// 确保右下角X ≤ 父窗口宽度p.setX(dragEndge.x() > parentWidget()->width()? parentWidget()->width() - rect().width(): p.x());// 确保右下角Y ≤ 父窗口高度p.setY(dragEndge.y() > parentWidget()->height()? parentWidget()->height() - rect().height(): p.y());//QWidget::move() 对窗口部件的位置进行设置move(p);
/*
move函数原型
void move(int x, int y);
void move(const QPoint &pos);*/}}

mouseReleaseEvent

释放鼠标时将m_mouseDown 设置为false,避免鼠标右键或其他案件误触发mouseMoveEvent

void CutDialog::mouseReleaseEvent(QMouseEvent *event)
{m_mouseDown = false;
}

小窗口移动触发父窗口的重绘事件

paintEvent调用时机:

​​首次显示窗口时​​
当 PhotoShotDialog 首次显示(例如通过 show() 或 exec())时,系统会自动触发 paintEvent 进行初始绘制。

​​窗口需要重绘时​​
窗口被其他窗口遮挡后重新暴露出来
窗口内容发生变化(如子窗口移动、尺寸变化)
调用 update() 或 repaint() 方法强制重绘

​​子窗口移动时(关键)​​
当用户拖动 CutDialog时:
CutDialog::mouseMoveEvent() 中调用了 move§ 移动裁剪框
移动操作会​​自动触发父窗口(PhotoShotDialog)的重绘​​,因为:
子窗口位置变化导致父窗口的可见区域需要更新
系统自动发送重绘事件到父窗口

void PhotoShotDialog::paintEvent(QPaintEvent *event)
{QPainterPath painterPath;QPainterPath p;p.addRect(x(),y(),this->rect().width(), this->rect().height()); //裁剪头像活动窗口 (蓝色矩形)//QWidget::geometry()返回一个 QRect 对象。这个对象包含了窗口部件的位置和大小信息painterPath.addRect(m_cutDialog->geometry()); //头像剪切窗口 (紫色矩形)QPainterPath drawPath = p.subtracted(painterPath); //subtracted 获取除了painterPath区域以外的窗口QPainter painter(this);painter.setOpacity(0.6); //设置Qt控件透明度 0表示全透明,1表示不透明painter.fillPath(drawPath, QBrush(Qt::black));
}

剪裁效果实现

void PictureEdit::on_pushButton_clicked()
{//直接复制小窗口的图像内容QPixmap pix = m_scaledPix.copy(m_psDialog->getCutGeometry());//将截图内容重命名,并保存到指定目录pix.save("D:\\work\\workspace\\qtstudyspace\\PictureEdit\\images\\cut.png", "png");
}

http://www.hkcw.cn/article/mXdlXkAssb.shtml

相关文章

Android基于LiquidFun引擎实现软体碰撞效果

一、实现效果 Android使用LiquidFun物理引擎实现果冻碰撞效果 二、Android代码 // 加载liquidfun动态库static {System.loadLibrary("liquidfun");System.loadLibrary("liquidfun_jni");}class ParticleData {long id;ParticleSystem particleSystem;float…

Baklib赋能企业AI知识管理实践

Baklib构建AI-ready知识体系 Baklib作为新一代知识中台的核心引擎&#xff0c;通过知识图谱构建与自然语言处理&#xff08;NLP&#xff09;技术&#xff0c;将碎片化信息转化为结构化知识资产。平台依托智能语义分析能力&#xff0c;自动识别文档中的实体关系与上下文逻辑&am…

如何在 Windows 11 24H2 的任务栏时钟中显示秒数

我们都很熟悉任务栏时钟&#xff0c;或者说&#xff0c;是我们运行 Windows 的电脑屏幕右下角的数字时钟。它显示小时和分钟的时间&#xff0c;这基本上是每个人需要的&#xff0c;但我们有时也需要看到秒数。随着 Windows 11 的最新更新&#xff0c;它可以在任务栏时钟中直接显…

navicate菜单栏不见了怎么办

别慌&#xff01;&#xff01;&#xff01; 将鼠标放到navicate框的最左侧&#xff0c;看到出现两个竖线&#xff08;像这样||&#xff09;&#xff0c;点击拖动鼠标拉出来吧。

张家界溶洞垃圾堆7层楼高 污染触目惊心

近日,一段视频曝光了张家界市慈利县一处天然溶洞遭到人为排污的情况,引发广泛关注。视频中,溶洞内流淌着泛着绿色的污水,伴有黄绿色的淤泥沉积,黑色污染物自洞壁滑落凝固成厚厚的“黑痂”。拍摄者称,垃圾堆积高度达到七八层楼,令人触目惊心。据张家界市生态环境局透露,…

软件安全保障关键之漏洞扫描:原理、分类及意义全解析?

软件安全保障的关键在于漏洞扫描&#xff0c;这项工作通过特定技术和流程进行&#xff0c;旨在发现软件中可能存在的安全隐患&#xff0c;比如缓冲区溢出、跨站脚本攻击等&#xff0c;这些漏洞得以被识别和记录&#xff0c;对确保软件安全具有重要意义。 扫描原理 漏洞扫描依…

韩国大选开始投票 5人竞逐总统 李在明领跑民调

韩国第21届总统大选于当地时间6月3日6时正式开始,全国共设有14295个投票站。没有参加提前投票的选民凭身份证件前往指定投票站即可参与投票,投票将于当日20时结束。本次大选共有7位候选人登记,但其中两位宣布退出并支持国民力量党候选人金文洙。因此,选民将从以下5位候选人…

计算机网络 : 应用层自定义协议与序列化

计算机网络 &#xff1a; 应用层自定义协议与序列化 目录 计算机网络 &#xff1a; 应用层自定义协议与序列化引言1. 应用层协议1.1 再谈协议1.2 网络版计算器1.3 序列化与反序列化 2. 重新理解全双工3. socket和协议的封装4. 关于流失数据的处理5. Jsoncpp5.1 特性5.2 安装5.3…

比亚迪打响降价战为哪般 应对销量与利润双重压力

比亚迪打响降价战为哪般 应对销量与利润双重压力。5月22日,比亚迪宣布对旗下王朝网和海洋网共计22款车型降价,降幅在1.2万元至5.3万元之间,活动将持续到6月底。这是比亚迪自三月底以来的第三次降价,力度最大。作为中国新能源汽车销量冠军,比亚迪的大面积、大幅度降价预示着…

电子电器架构 --- 远程信息控制单元(TCU)

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 所谓鸡汤&#xff0c;要么蛊惑你认命&#xff0c;要么怂恿你拼命&#xff0c;但都是回避问题的根源&…

榴莲大降价!它能从“奢侈果”变成“亲民果”吗

夏季是各类水果集中上市的季节,榴莲爱好者们最近有口福了,市场上榴莲价格出现了大幅下降,甚至“腰斩”的情况。造成榴莲价格下跌的原因都有哪些?榴莲会不会就此从“奢侈果”变成“亲民果”?走进位于浙江湖州的一家榴莲批发店,榴莲成堆地被摆放在货架上,老板肖女士正在开…

ULVAC A2K 20K 40K CU Bar type 主动灭弧器 Active Arc Killer

ULVAC A2K 20K 40K CU Bar type 主动灭弧器 Active Arc Killer

美国再提高进口钢铝关税有何目的 贸易保护主义抬头

美国再提高进口钢铝关税有何目的 贸易保护主义抬头。当地时间5月30日,美国总统特朗普在宾夕法尼亚州的一场集会上宣布,将把进口钢铁的关税从25%提高至50%,并表示该决定从6月4日起生效。白宫当天也在社交媒体上发布公告称,为进一步保护美国钢铁行业免受外国和不公平竞争的影…

PCIe 边缘卡的 PCB 设计和引脚排列

标准台式计算机和嵌入式计算机中最常见的附加卡是 PCIe 卡。PCIe 附加卡具有多种外形尺寸&#xff0c;并使用边缘插槽连接器&#xff0c;可沿主板垂直或直角安装。您还有不同类型的 PCIe 设备&#xff0c;例如插入 M.2 连接器的 SSD 或模块。 在本文中&#xff0c;我将介绍使用…

吴恩达机器学习笔记(1)—引言

目录 一、欢迎 二、机器学习是什么 三、监督学习 四、无监督学习 一、欢迎 机器学习是当前信息技术领域中最令人兴奋的方向之一。在这门课程中&#xff0c;你不仅会学习机器学习的前沿知识&#xff0c;还将亲手实现相关算法&#xff0c;从而深入理解其内部机理。 事实上&…

5月中国100个城市新房均价上涨 环比上涨0.30%

5月中国100个城市新房均价上涨 环比上涨0.30%!6月1日,中指研究院发布《中国房地产指数系统百城价格指数报告》。报告显示,5月全国100个城市新建住宅平均价格环比上涨0.30%,同比上涨2.56%。具体来看,33个城市环比上涨,54个城市环比下跌,13个城市持平。二手房价格和租金则…

婚礼现场喜婆婆上台表演才艺助兴 倒立旗袍秀惊呆众人

婚礼现场喜婆婆上台表演才艺助兴 倒立旗袍秀惊呆众人。婚礼上,儿媳正安安静静地享受美食,没想到婆婆却在舞台上大显身手,开始表演了起来。5月26号,浙江一对小夫妻的婚礼热闹得像过年,媳妇在台下大快朵颐,结果她妈居然跑到台上倒立表演,还特意穿了个旗袍,一边倒头翻转一…

专家:中方捍卫主权让西方政客破防 坚定立场震慑“台独”

专家:中方捍卫主权让西方政客破防 坚定立场震慑“台独”!近日,国防部新闻发言人张晓刚大校就台湾问题及解放军演练活动作出回应,重申台湾是中国不可分割的一部分,并强调中国军队的演练活动旨在捍卫国家主权与领土完整。这一表态既是对外部势力干涉台海局势的警告,也是对“…

牛弹琴:乌无人机攻击预示可怕未来 战争新纪元开启

牛弹琴:乌无人机攻击预示可怕未来 战争新纪元开启。乌克兰最近进行了一次大胆且成功的无人机集群攻击,这次行动的目标甚至远至俄罗斯西伯利亚,靠近俄罗斯和蒙古国边境。根据乌克兰总统泽连斯基的说法,这次袭击是经过一年多精心策划的,乌军出动了117架无人机,给俄军造成了…

佛山叠滘“郭富城”扒龙船帅到飞起 水上速度与激情

佛山叠滘“郭富城”扒龙船帅到飞起 水上速度与激情。当18岁的打工仔放下螺丝刀,拿起龙舟桨,在S弯河道上演“水上速度与激情”时,传统文化不再是老年人的专属。这个被网友称为叠滘“郭富城”的小伙,用汗水和笑声撕掉了传统运动的陈旧标签。在叠滘不足5米的窄巷水道里,25米长…