从 0 到 1,手把手带你开发截图工具 ScreenCap------001 实现基本的截图功能
ScreenCap---Version:001
说明
从 0 到 1,手把手带你开发 windows 端的截屏软件 ScreenCap
当前版本:ScreenCap---001
支持全屏截图
支持鼠标拖动截图区域
支持拖拽截图
支持保存全屏截图
支持另存截图到其他位置
GitHub
若您无法正常访问,每次项目的资源会随文章一同发布,下载压缩包即可,永久免费
压缩包可能较 GitHub 更新不及时,请谅解
开发环境
win10 系统
编译器 qtcreator4.11.1
QT 版本:5.14.2
C++11
问题解决
需求
提供开始截图的按钮,点击开始截图
在截图界面提供右键菜单选择
菜单实现保存当前的截图
保存全屏截图
截图另存为
全屏截图另存为
退出截图
鼠标可以拖拽截屏区域
图片属性实时计算
结构
思路
screencapwidget
首先需要创建页面 ScreenCapWidget,提供开始截屏,按键设置,默认位置的按钮
首先实现开始截屏的功能,这里不能直接在窗口线程实现,需要单独创建一个 screenwidget 类实现截屏的主要操作
获取到 screenwidget 的实例后,应该处理截屏的逻辑了,创建实例的时候直接调用 screenwidget 父类 widget 的 showFullScreen 函数,将 screenwidget 以全屏的方式显示出来,整个屏幕是当前截屏的操作区域,遮挡其他操作,这里我们重写一下 screenwidget 的 showEvent 事件
screenwidget
而这个 screenwidget 类不应该一直存在,应该是调用开始截屏的时候才开始创建,这里为了保证同一时刻只有一个 screenwidget 类创建,应该使用单例模式,确保只有一个实例
screenwidget 创建的时候不需要 ui 文件,这里我们只需要使用 widget 里的绘图事件和菜单功能,自己使用代码实现
在头文件里首先维持一个静态的 QScopedPointer 对象 self,用于实现单例模式
定义一个公共的静态接口 Instance 以实现其他类来生成 screenwidget 对象
下面来实现类的默认构造函数,提供菜单功能,实现保存当前的截图,保存全屏截图,截图另存为,全屏截图另存为,退出截图的功能
因为 screencapwidget 调用其 fullShowScreen 函数,这里重写 showEvent 函数
showEvent 函数中,直接获取当前主屏幕的全屏图像保存在 fullScreen 中,为提示用户截屏开始了,这里获取到全屏对象后,模糊处理全屏,维持一个背景值 bgScreen 实现背景处理
截屏界面的交互逻辑等会再实现,先处理关键的部分,创建一个 myscreen 类,实现截屏实现的数据主要逻辑
重写完 showEvent 后,已经获取到全屏图像了,需要开始处理部分截图了,即处理鼠标事件,首先处理鼠标按下 press 事件,第一次按下的位置就是起始位置,再根据此时 myscreen 的 STATUS 处理对应的事件
处理鼠标移动的事件,如果还在 myscreen 还在选择状态,那么移动完的位置就是截屏的结束位置,myscreen 在移动状态,那么计算偏移量减去移动开始时候的起始位置 movPos 即可,将偏移量传入 myscreen 的 move 函数中,计算 move 后的截屏区域
主要的鼠标事件处理完了,下面处理 release 和右键事件
鼠标事件处理完了之后,要截屏的图像的区域我们已经知道了,下面重写 paint 事件
myscreen
该类主要实现对截屏的数据计算,来给 screenwidget 重写事件提供详细的数据
这里的类不需要窗口文件,创建纯粹的 cpp 类即可
需要获得从 screenwidget 类传入的 qsize 参数,这里使用带 qsize 参数的构造函数
首先截屏需要维护屏幕长和宽的值,maxHeight 和 maxWidth,这里的数据应该是谁调用谁能获取,全部设置为私有属性,还需要设置其 getWidth 和 getHeight 方法
还需要维持截屏区域的左上角和右下角的 point 值 leftUpPos 和 rightDownPos,并设置 getLeftUp 和 getRightDown 方法
处理鼠标事件的时候,需要判断当前截图的状态,维持枚举值 STATUS,保存选择截屏区域,拖拽截屏,
这里需要实现判断鼠标是否在现有的截屏区域内 isInArea 和计算移动后的截屏位置的 move 函数
其他功能
关键代码
注:关键代码只负责解释各部分的逻辑关系,详解看代码注释
screencapwidget 处理开始截屏的功能,创建 screenwidget 的唯一实例,并显示全屏窗口
与 showFullScreen 相关的 screenwidget 的重写 showEvent 事件
screenwidget 实现单例模式的主要代码
creenwidget 提供的菜单功能
screenwidget 维持 myscreen 的类,并在 screenwidget 的构造函数中实例化 myscreen 类,传入当前屏幕的大小,二者同步生成
获取到当前屏幕的 qrect 对象,调用 size 函数获取屏幕的 size 值,使用宏展开式,不单独处理了,需要的时候直接绽开计算
处理图片移动
处理鼠标 press
处理鼠标 move
文章转载自:KanHai1024
评论