最近写了一个修改头像功能的UI,布局参考了QQ目前的修改头像界面。如下图

这里主要说明一下两个地方的技术:1.头像图片上层的遮罩层,圆形外部为灰色,内部为全透明;2.上传图片宽高比例可以通过鼠标拖拽移动图片显示并通过滑动条进行图片大小放缩

遮罩层说明

遮罩层的处理主要在于怎么在一个透明灰色窗口上擦除出一个透明的圆形。之前使用了QPainter::CompositionMode里面的QPainter::CompositionMode_Clear擦除模式,但是试验后结果是,对于顶层窗口(没有父窗口)的效果是OK的,但是针对这里以显示图片的滚动区域窗口为父窗口的遮罩层,擦除只会变成完全的黑色。

重新考虑之后想到了ClipPath,剪切的绘图路径,通过在QPainterPath里增加路径获取一个剪切路径,再设置给QPainter,即可达到需要的效果,关键代码如下

m_pDivWidget->resize(ui.scrollArea->size());

QPainterPath path;

path.addRect(m_pDivWidget->geometry());

path.addEllipse(m_pDivWidget->geometry().adjusted(2, 2, -2, -2));

QPainter p(m_pDivWidget);

p.setRenderHint(QPainter::Antialiasing);

p.setBrush(QColor(100, 100, 100, 200));

p.setClipPath(path);

p.drawRect(m_pDivWidget->geometry());

如果不想子类化QWidget,可以在父窗口里注册过滤事件,捕获遮罩层的绘图事件来重绘遮罩层QEvent::Paint == event->type()。

拖拽滚动窗口

其实简单说就是拖拽来模拟滚动条拖拽的效果,拖拽的距离和滚动区域内展示窗口的大小比例,再结合滚动条的当前值可以算出滚动条应该更新的值。代码如下

DragScrollArea::DragScrollArea(QWidget *parent)

: QScrollArea(parent)

{

//首先,关闭显示所有滚动条

setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

}

DragScrollArea::~DragScrollArea()

{

}

bool DragScrollArea::event(QEvent* event)

{

if (widget())//没有滚动窗口的时候,不处理

{

static QPoint pos;//记录拖拽位置

if (QEvent::MouseButtonPress == event->type())

{

//开始拖拽

QMouseEvent* mouseEvent = static_cast(event);

pos = mouseEvent->pos();

}

else if (QEvent::MouseMove == event->type())

{

QMouseEvent* mouseEvent = static_cast(event);

if (Qt::LeftButton & mouseEvent->buttons())

{

//计算偏移量

pos = mouseEvent->pos() - pos;

//根据偏移量算出当前滚动条更新的值

horizontalScrollBar()->setValue(horizontalScrollBar()->value() - pos.x()*horizontalScrollBar()->maximum() / widget()->width());

verticalScrollBar()->setValue(verticalScrollBar()->value() - pos.y()*verticalScrollBar()->maximum() / widget()->height());

pos = mouseEvent->pos();

}

}

}

return QScrollArea::event(event);

}

最终效果如图

项目代码地址,界面重新做了简单调整

https://github.com/KaiMingPrince/QtProject/tree/master/ChangeHeader

Qt小项目之串口助手控制LED

Qt小项目之串口助手控制LED 前言 最近刚学了一点Qt开发上位机,尝试着做个小软件练练手.查找了很多资料,做了一个简单的串口助手,可以实现串口基本发送和接收功能,支持中文显示,还可以控制STM32开 ...

仿QQ空间动态界面分享

先看看效果: 用极少的代码实现了 动态详情 及 二级评论 的 数据获取与处理 和 UI显示与交互,并且高解耦.高复用.高灵活. 动态列表界面MomentListFragment支持 下拉刷新与上拉加载 ...

android 仿QQ气泡聊天界面

1.现在的QQ,微信等一些APP的聊天界面都是气泡聊天界面,左边是接收到的消息,右边是发送的消息, 这个效果其实就是一个ListView在加载它的Item的时候,分别用了不同的布局xml文件. 2.效 ...

day75 bbs项目☞后台管理+修改头像

目录 一.后台管理之添加文章 二.修改用户头像 bbs项目总结 一.后台管理之添加文章 添加文章有两个需要注意的问题: 文章的简介切取,应该想办法获取到当前文章的文本内容后再截取字符 XSS攻击,由于 ...

巧妙的Jq仿QQ游戏导航界面学习

先贴上源代码

仿QQ好友列表界面的实现

TableView有2种style:UITableViewStylePlain 和 UITableViewStyleGrouped. 但是QQ好友列表的tableView给人的感觉似乎是2个style ...

Qt小程序仿写----FileRead程序

该程序实现如下功能:1.打开TXT文件A.txt:2.将文件路径显示到一个文本编辑框里面,文件内容显示到一个文本域里面:3.在文本域里面更改文件内容之后,保存文本域的内容到当前文件路径下. 定义了一F ...

小程序仿QQ侧滑例子

缩放:wxml

对比iOS网络组件:AFNetworking VS ASIHTTPRequest(转载)

在开发iOS应用过程中,如何高效的与服务端API进行数据交换,是一个常见问题.一般开发者都会选择一个第三方的网络组件作为服务,以提高开发效率和稳定性.这些组件把复杂的网络底层操作封装成友好的类和方法, ...

1021 Fibonacci Again (hdoj)

Problem Description There are another kind of Fibonacci numbers: F(0) = 7, F(1) = 11, F(n) = F(n-1) ...

poj3308 Paratroopers --- 最小点权覆盖->最小割

题目是一个非常明显的二分图带权匹配模型, 加入源点到nx建边,ny到汇点建边,(nx.ny)=inf建边.求最小割既得最小点权覆盖. 在本题中因为求的是乘积,所以先所有取log转换为加法,最后再乘方回 ...

【Python之路】第一篇--Linux基础命令

pwd 命令 查看”当前工作目录“的完整路径 pwd -P # 显示出实际路径,而非使用连接(link)路径:pwd显示的是连接路径 .   表示当前目录 ..  表示上级目录 /  表示根目录 ls ...

sql的一点总结<一>

sql总结 1.常见的数据库对象有哪些?表(table) 视图(view) 序列(sequence) 索引(index) 同义词(synonym)存储过程(procedure) 存储函数(functi ...

android 仿qq修改头像,Qt:小项目仿QQ修改头像界面,技术点记录相关推荐

  1. qt小项目 代码实现简易的QQ聊天界面

    qt小项目 代码实现简易的QQ聊天界面 代码 效果图 总结 代码 myDialog.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QW ...

  2. QT小项目--头脑风暴

    QT小项目--头脑风暴 项目演示: 客户端: 单人联网模式 双人匹配对战模式 单机本地练习模式 服务器 服务器主要功能 项目演示: 客户端: 登陆界面,有登陆功能和注册功能,当选择登陆时,如果无此账号 ...

  3. QT小项目---2048小游戏

    目录 效果展示 游戏简介 游戏详情 操作指南 操作技巧 代码实现 QWidget.h Widget.cpp GameWidget.h GameWidget.cpp 总结 效果展示 游戏简介 游戏详情 ...

  4. android简单app实例_Android安卓小项目实战视频教程集锦

    Android安卓小项目实战视频教程,点击进入视频教程: 一.安卓项目视频教程: 1蓝牙聊天APP介绍-分步骤介绍一个简单安卓蓝牙APP的开发过程 - 西瓜视频 2蓝牙聊天开发流程-分步骤介绍一个简单 ...

  5. android微信运动页面开发,微信小程序仿微信运动步数排行(交互)

    微信小程序仿微信运动步数排行(交互) 发布时间:2020-08-20 00:51:02 来源:脚本之家 阅读:101 作者:祈澈姑娘 本文介绍了微信小程序仿微信运动步数排行(交互),分享给大家,也给自 ...

  6. QT小项目Demo【附功能图及源码】

    由于正式项目未开始,之前自个做的小项目,界面全靠想象,现在列出来供参考下 注:资源链接在文末 老老老规矩,正文开始,十步走 后面的同学头抬起来看黑板,看不见就站起来~ 一.登录[可注册,校验用户名密码 ...

  7. php取微信名字和头像,微信小程序如何获取用户头像和昵称

    本文介绍了微信小程序如何获取用户头像和昵称,分享给大家,具体如下: 代码user.wxml: {{userInfo.nickName}} user.js //sort.js //獲取應用實例 var ...

  8. php 仿美团切换城市,微信小程序仿美团城市选择的实现

    这篇文章主要为大家详细介绍了微信小程序仿美团城市选择,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了微信小程序城市选择器,供大家参考,具体内容如下 代码很简单. var cit ...

  9. Android小项目——仿iPhone计算器

    计算器 前言 界面设计 界面展示 整体框架 按钮布局 应用名字图标 MainActivity 核心算法 中缀转后缀表达式 后缀表达式计算 前言 一个模仿iPhoneUI的计算器,支持大数运算,带括号的 ...

最新文章

  1. 逆生长!小鼠「逆龄疗法」登Nature子刊,有望用于人类
  2. springmvc DispatchServlet初始化九大加载策略(一)
  3. 转:Unity3D研究院之提取游戏资源的三个工具支持Unity5(八十四)
  4. [转载] Python3十大经典错误及解决办法
  5. (王道408考研操作系统)第四章文件管理-第一节6:文件基本操作
  6. RISC 和 CISC 区别
  7. c语言编写界面图形表示,「分享」C语言如何编写图形界面
  8. 单列(写了池子pool)用list实现的方法, 与伪单例(写了池子zidianpool),用字典实现的方法,可以存入不同,i名字的物体...
  9. Scikit-Learn (浅谈PCA降维算法)
  10. Oracle学习资料分享(含教程、笔记、题库下载与学习方法)
  11. [渝粤教育] 重庆大学 房屋建筑学 参考 资料
  12. 小学生数学测试软件论文,测试数学论文,关于小学生数学基本能力测试量表的贵族常模制订相关参考文献资料-免费论文范文...
  13. centos7桌面没有计算机图标,Centos7,桌面图标消失且右键失效
  14. is 简写 缩写_为什么e.g.是for example的缩写?它和i.e.是什么关系?
  15. TOP100summit分享实录 | 网易卡爷:实战解读增长黑客在 B 端业务中的应用
  16. 元宇宙大火的“天时、地利、人和”
  17. 惊喜盲盒中奖iPhone 13已收到货
  18. swift 判断是否设置了代理
  19. 山东大学软件学院项目实训-创新实训-网络安全靶场实验平台(十五)
  20. 在PC上安装Android SDK与Android模拟器 - 使用Android Studio 3.1.1

热门文章

  1. 输出杨辉三角形的前n行
  2. VIVO开发者平台上架APP
  3. 【软件定义汽车】【架构篇】SOA面向服务的软件架构
  4. 智慧高速 3D 可视化,构建互联协同智能交通体系
  5. 腾讯视频云签到(2022-5-29更新)
  6. Inter IPP 绘图 ippi/ipps
  7. [资料]无人机资料大满足
  8. 川崎焊接机器人编程实例_少、减轻—焊接机器人编程3种方法川崎焊接机器人使变压器的体积减...
  9. 故障管理系统,如何使用二维码报修
  10. 很好看的宇宙人404模板源码