2021【3 】3
ISSN:2661-3719(Print); 2661-3727 (Online) 计算机系统网络和电信 163
基于 QT 的截屏软件的设计与实现
郑焱鑫 白俊鸽
成都锦城学院计算机与软件学院 四川 成都 611731
【摘要】基于信息社会的快速发展,截屏已成为一种保存信息的快捷方式,而当下的很多软件又绑定了很多垃圾软件。本 文设计并开发的这一款截屏软件,以简洁为特点,以截取全屏,截取部分,保存至剪切板,标记图片为主要功能可以很容 易满足用户的需求。
【关键词】C++;Qt;屏幕抓取
1 引言
现代社会,获取关键信息已经成为了一种人的共识。
而为了在短时间内保存关键信息,屏幕截取就成为了一 种不可获取的方式。虽然现在市场上面有很多带有截屏 功能的软件,但是要使用这些截屏功能的前提是要打开 一个可能不会使用的软件,这就很麻烦,并且只是附带 了截屏功能的软件,保存信息也不方便,容易丢失截取 的信息,本文设计并开发的这一款软件,以纯净,简单 为主题就可以很容易的满足用户的需求。
2 开发环境介绍
Qt 是一个封装程序界面的框架。Qt 是面向对象的框 架,Qt 很容易扩展,并且允许真正地组件编程。Qt 是一 个 C++ 工具包,它由几百个 C++ 类构成,在我们编写自 己的程序是可以使用这些类。因为 C++ 是面向对象的编 程语言,而 Qt 是居于 C++ 构造,所以 Qt 也具有 OOP 的 所有优点。[1]
3 主要功能描述
本软件功能从系统托盘开始分为三个部分,第一个 是全屏截取,第二个是局部截取,第三个是打开主面板。
其中第二部分局部截取中又分为三个部分,第一个是保 存图片到磁盘,第二个是复制图片到剪切板,第三个是 标记关键字。用户可以在系统托盘上使用全屏截取功能 然后保存文件到本地目录,也可以使用部分屏幕截取功 能,然后在屏幕上画出想要的部分保存至本地,也可以 复制到剪切板,也可以在截取的图片上面进行重点勾画。
用户也可以在系统托盘上打开主面板,主面板上面同样 可以实现这些功能。
4 界面设计
本软件设计了一个主面板,所有的功能都能在主面 板上通过点击按钮实现,但考虑到本软件的目的是实现 屏幕的截取,为了保持截取屏幕的效果,本软件做了系 统托盘,这样用户可以在使用截屏软件时关闭主面板,
这样就可以保证全屏截取的图片不会因为软件的界面而 有所干扰。界面如下图 1 所示。
图 1 软件主界面图
5 功能实现
5.1 主面板控件本产品的目标旨在设计一款简洁,方便,目标性强 的截屏软件,所以本产品的界面尽量简化,主面板上面 只有四个按钮控件和一个文本标签控件。第一个按钮是 全屏抓取按钮用于实现全屏截取功能。第二个按钮是部 分截屏按钮用于实现区域截屏功能。第三个按钮是最小 化按钮用于实现主面板的最小化功能。第四个按钮是退 出按钮用于实现软件的退出功能。信号和槽是一种高级 接口 , 应用于对象之间的通信 , 它是 QT 的核心特性也是 QT 区别于其它工具包的重要地方。[2]按钮的功能实现是 通过信号与槽的连接实现的。信号与槽的连接通过调用 QObject 对象的 connect 函数来将某个对象的信号与另 外一个对象的槽函数相关联 , 这样当发射者发射信号时 , 接收者的槽函数将被调用。[3]TextLabel 控件用于显示当 前的时间。
5.2 屏幕截取功能
本 产 品 的 屏 幕 截 取 功 能 分 为 两 个 部 分, 一 是 全 屏 截 取。 这 一 部 分 是 实 现 是 调 用 了 抓 取 屏 幕 的 方 法 grabWindow(),这个函数可以抓取当前的屏幕,然后我 用一个变量去接收屏幕抓取的这张图片,接受完之后调 用接口打开文件对话框保存这张图片,当图片保存成功 以后会有一个保存成功的提示。二是区域截屏,这一部 分的实现是在全屏截取的基础上实现的。这一个功能的 原理是先对屏幕进行全屏抓取,然后对抓取的图片进行
164 Computer system network and elecommunications 处理,即对图片进行想要的区域的截取。调用 copy() 函
数就可以实现对屏幕的部分截取。在这个函数里面传入 想要的区域的参数,就可以得到想要的那一个区域的图 片。而怎么样动态的改变想要的区域的大小以及给用户 一个好的使用体验,就需要使用到绘图事件函数,鼠标 移动事件函数,鼠标按下事件函数以及鼠标释放事件函 数。事件是由窗口系统或 Qt 自身产生的 , 例如当用户按 下或者松开键盘或鼠标上的按键时就可以产生一个键盘 或者鼠标事件,当某个窗口第一次显示的时候 , 就会产 生一个绘制事件 , 用来告知窗口需要重新绘制它本身 , 从而使得该窗口可见。我使用 Qt 里面的 Qpoint 类构造 了一个起点和一个终点,由这两个点来确定用户想要的 图片区域的大小。首先,用户在点击了部分截屏按钮的 时候,本产品会使窗口透明且全屏显示,然后此时用户 可以使用鼠标在屏幕上进行点击,当用户在屏幕上点击 鼠标左键的时候,会调用鼠标按下事件函数来确定用户 想要截取的区域的一个起点,然后用户按住鼠标左键移 动鼠标这时候就会调用鼠标移动事件函数,并且实时返 回鼠标的终点坐标,并且在鼠标移动事件函数里面调用 update() 函数让窗口重绘,也就是调用了绘图事件函数。
我们在这个函数里面画了一个矩形,矩形的起点和长宽 是由用户在窗口上面移动鼠标确定的。用户在窗口上面 确定的起点与终点,会让程序调用画矩形的函数,画出 的这个矩形也就是用户想要的区域又会显示在窗口上。
这样用户就可以很好地确定自己的区域是否是自己想要 的区域。用户可以反复重新规划区域,直到用户得到自 己想要的区域。当用户得到自己想要的区域以后,这时 候用户可以点击鼠标右键,这时候屏幕上就会出现一个 菜单,菜单里面有四个功能,一是保存图片到文件夹,
二是复制图片,三是标记图片,四是退出截屏。当用户 得到了想要的图片区域以后点击鼠标右键,在出现的菜 单里面选择保存图片,用户输入完图片名称以后就会提 示图片保存成功。这样一个部分截屏的功能就完成了。
5.3 复制图片功能
复制图片这一功能是将截取的图片复制到剪切板,
也就是用户点击了菜单里面的复制功能以后,用户可以 在其他可粘贴的地方右击鼠标,点击粘贴就可以把复制 的图片粘贴出来,这一功能的实现是使用了系统的接口 clipboard() 来实现的,我们只需要传入接受全屏抓取 的那张图片的变量,和想要截取的区域即用户所画的矩 形的起点和终点以及矩形的长度和宽度就完成了图片的 复制功能。
5.4 图片标记功能
屏幕截取是为了方便地获取重要的信息,为了强调 一张图片里面的某些信息,我们就需要对图片中的信息 进行标记。为此我开发了程序的文本标记功能,即可以 对用户想要强调和凸显的文字进行画线标记。在用户得 到想要的区域以后点击鼠标右键,选择菜单里面的标记 选项就可以再次绘图,在图片里面标记自己想要强调的 部分,用户标记完自己想要强调的部分以后,就可以点 击菜单里面的保存选项来保存图片。而这一部分的实现 也是在绘图事件函数里面实现的。用户在屏幕上面画的 矩形可以通过重绘来多次绘制,然而我们需要在图片上
面进行多次重新绘制却不行。因为在图片上面所画的每 一笔都会留在上面而不会因为重绘而消失。为了解决这 样一个难题,在设计这一功能的时候我想到了开发者的 上帝视角。在用户选择标记功能的时候先在屏幕上进行 画线标记,等用户确定了所标记的部分后,程序再实现 在图片上画线的功能。这样图片的文本标记功能就实现 了。
5.5 加载系统托盘
因为本产品的主要目的是为了实现屏幕的截取功能,
所以要尽量保持界面的整洁。为了增加程序使用的方便 性以及防止程序占用界面,为此实现程序的系统托盘。
加载系统托盘以后就不会占用用户的界面,也不会对用 户的日常工作产生干扰。同时做了一个托盘菜单,在托 盘菜单里添加了完整的程序功能,这样就更加的方便了 用户的使用。托盘菜单下图二所示。
图 2 系统托盘菜单
6 测试与结论
本产品测试了全屏截取功能,部分截取功能,以及 保存图片到剪切板,均表现正常。测试其图片标记功能时,
发现了线条会画出图片区域外,虽然不影响标记功能,
但是影响用户体验,后期准备写一个函数去对它进行限 制来优化。测试退出当前截屏的时候,发现程序会退出,
也就是只能截取一次。经过测试查找出了问题,在主函 数中添加了关闭窗口但不退出程序的代码来完成了对程 序的优化。经测试其余功能均表现正常。
7 结束语
本文介绍了如何使用 QT 开发一款截屏软件,该软件 实现了基本的全屏截取功能,部分截取,复制图片到剪 切板的功能以及对截图进行文本标记的功能,能够满足 用户对于屏幕截取的需求。虽然还存在一些不足的地方,
在以后的优化中会加入添加文字的功能,以及更改字体 的大小以及字体的颜色的功能。
【参考文献】
[1] 张春艳 . 基于 Qt 的嵌入式图形用户界面研究 与实现 [D]. 大连海事大学 ,2008.
[2] 朱德新 , 王爽 . 信号和槽机制的研究与应用 [J]. 才智 ,2011(35):323.
[3] 龚凌璞 .Qt 框架中信号和槽机制的研究 [J]. 计 算机光盘软件与应用 ,2013,16(11):281+283.