Qt浅谈之十三:抓图截屏

2024-03-11 11:08
文章标签 qt 浅谈 十三 截屏 抓图

本文主要是介绍Qt浅谈之十三:抓图截屏,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、简介

       因Windows下无法登录QQ时就不能抓图了,就很纠结了,而在Linux下,有时也无法抓图。所以专门使用Qt仿照Centos的抓图界面写了一个抓图软件,能实现自己的大部分需求。感兴趣的可以扩展到图片的分割组合及录屏等功能。

二、运行图

(1)本程序运行如下图1所示。

(2)其他相关截图程序的界面,如下图2所示。

 

三、详解

1、中文问题

(1)不同的操作系统采用编码方式不同,因此必须使用国际化翻译才能减少乱码的实现。其过程如下:

1.pro工程文件里面添加 TRANSLATIONS+=mypro.ts
2.选择Qt Creator环境的菜单栏 工具->外部->Qt语言家->更新翻译
3.桌面开始菜单里面Qt目录打开 Linguist工具
4.Linguist工具加载生成好的mypro.ts文件
5.填好翻译, 保存, Release, 就生成好编译后的qm文件
6.在工程的源文件中, 这样加载qm文件:
QTranslator translator;
translator.load("grabwindows.qm",":/");
a.installTranslator(&translator);

2、系统托盘

 

void GrabWindows::initTrayiconMenu()
{trayIcon = new QSystemTrayIcon(QIcon(tr(":/applets-screenshooter.ico")), this);trayiconMenu = new QMenu;restoreAction = new QAction(tr("Restore"), this);quitAction = new QAction(tr("Quit"), this);trayiconMenu->addAction(restoreAction);trayiconMenu->addAction(quitAction);trayIcon->setContextMenu(trayiconMenu);trayIcon->show();connect(trayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(slotIconActivated(QSystemTrayIcon::ActivationReason)));connect(restoreAction,SIGNAL(triggered()),this,SLOT(showNormal()));connect(quitAction,SIGNAL(triggered()),this,SLOT(close()));
}

 

分析:QSystemTrayIcon的使用,并结合槽来捕获鼠标左键的信号,鼠标右键信号会自动弹出定义的右键菜单。

3、抓取全屏

 

fullScreenPixmap = QPixmap::grabWindow(QApplication::desktop()->winId());
fullScreenPixmap->save("fullScreen.jpg","JPG");
或
fullScreenPixmap->save("Screenshot.png","png");

 

只要完成了布局,剩下的截图代码非常简单,Qt已经做了很好的封装。

4、抓取当前窗口

 

if (QApplication::activeWindow()) {currentScreenPixmap = QPixmap::grabWindow( QApplication::activeWindow()->winId(), -2, -26, QApplication::activeWindow()->width() + 4, QApplication::activeWindow()->height() + 30);//currentScreenPixmap = QPixmap::grabWindow( QApplication::activeWindow()->winId());
}

分析:暂时还有一些问题,不知道为什么当前活动的窗体只能是本窗体,其它窗体的返回值为NULL,其它的函数也试过。也无法获取到相对与本窗口的次窗口指针,感觉Qt没有提供相关的接口,要借助于系统的api接口。该问题先放置,以后有机会解决。

 

5、抓取任意部分

 

ScreenShotPart::ScreenShotPart(QWidget *parent) :QDialog(parent)
{//setMouseTracking(true);isDrawing = false;fullScreenPix = QPixmap::grabWindow(QApplication::desktop()->winId());fullTempPix = fullScreenPix;
}void ScreenShotPart::showEvent(QShowEvent *event)
{showFullScreen();setCursor(Qt::CrossCursor);
}void ScreenShotPart::paintEvent(QPaintEvent *event)
{QPainter painter(this);painter.drawPixmap(0, 0, fullTempPix);QDialog::paintEvent(event);
}

分析:先截图全屏图片,显示图片占据全屏,然后使用双缓冲技术(否则会出现很多选区框)在该图片上画出选区,然后保存。其原理简单,主要是鼠标时间时记录好初始点和结束点。

 

 

void ScreenShotPart::mousePressEvent(QMouseEvent *event)
{if (event->button() == Qt::LeftButton) {isDrawing = true;startPoint = event->pos();}
}void ScreenShotPart::mouseMoveEvent(QMouseEvent *event)
{QPoint pt = event->pos();if (isDrawing) {fullTempPix = fullScreenPix;endPonit = event->pos();paint(fullTempPix);}
}void ScreenShotPart::mouseReleaseEvent(QMouseEvent *event)
{if (event->button() == Qt::LeftButton) {isDrawing = false;endPonit = event->pos();shotRect = QRect(startPoint, endPonit);paint(fullTempPix);savePixMap();}
}

 

 

6、定时器

timer = new QTimer(this);
timer->start(200 + timeComBox->value() * 1000);

分析:定时器在此处作用还是挺大的,主要是提供延时让本窗口隐藏,以获得截取的全屏图片,否则全屏总是会有本窗口的内容。

 

 

 

四、不足之处

(1)无法很好的抓取当前窗口,正在考虑如何截取本窗口的下一层窗体。在Windows下截图的当前窗口为空白。

(2)ComboBox下的文件系统路径无法使用,加载了文件系统也无法一次进行选择,效果图也不是很美观,这个问题还待深究。截图图片暂时只能保存到当前程序的运行目录下。

五、总结

(1)还可以根据需要在截图时将背景图片设置成灰色,效果更好。

 

(2)源码已经打包上传到csdn上可登录下载(http://download.csdn.net/detail/taiyang1987912/7693465)。  

 

(3)本人思路有限,若有更好的设计建议,也可发邮件沟通,在此先感谢!邮箱地址yang.ao@i-soft.com.cn。

 

 

这篇关于Qt浅谈之十三:抓图截屏的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/797626

相关文章

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Qt中QGroupBox控件的实现

《Qt中QGroupBox控件的实现》QGroupBox是Qt框架中一个非常有用的控件,它主要用于组织和管理一组相关的控件,本文主要介绍了Qt中QGroupBox控件的实现,具有一定的参考价值,感兴趣... 目录引言一、基本属性二、常用方法2.1 构造函数 2.2 设置标题2.3 设置复选框模式2.4 是否

QT进行CSV文件初始化与读写操作

《QT进行CSV文件初始化与读写操作》这篇文章主要为大家详细介绍了在QT环境中如何进行CSV文件的初始化、写入和读取操作,本文为大家整理了相关的操作的多种方法,希望对大家有所帮助... 目录前言一、CSV文件初始化二、CSV写入三、CSV读取四、QT 逐行读取csv文件五、Qt如何将数据保存成CSV文件前言

Qt中QUndoView控件的具体使用

《Qt中QUndoView控件的具体使用》QUndoView是Qt框架中用于可视化显示QUndoStack内容的控件,本文主要介绍了Qt中QUndoView控件的具体使用,具有一定的参考价值,感兴趣的... 目录引言一、QUndoView 的用途二、工作原理三、 如何与 QUnDOStack 配合使用四、自

Qt spdlog日志模块的使用详解

《Qtspdlog日志模块的使用详解》在Qt应用程序开发中,良好的日志系统至关重要,本文将介绍如何使用spdlog1.5.0创建满足以下要求的日志系统,感兴趣的朋友一起看看吧... 目录版本摘要例子logmanager.cpp文件main.cpp文件版本spdlog版本:1.5.0采用1.5.0版本主要

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col

浅谈mysql的sql_mode可能会限制你的查询

《浅谈mysql的sql_mode可能会限制你的查询》本文主要介绍了浅谈mysql的sql_mode可能会限制你的查询,这个问题主要说明的是,我们写的sql查询语句违背了聚合函数groupby的规则... 目录场景:问题描述原因分析:解决方案:第一种:修改后,只有当前生效,若是mysql服务重启,就会失效;

Qt 中 isHidden 和 isVisible 的区别与使用小结

《Qt中isHidden和isVisible的区别与使用小结》Qt中的isHidden()和isVisible()方法都用于查询组件显示或隐藏状态,然而,它们有很大的区别,了解它们对于正确操... 目录1. 基础概念2. 区别清见3. 实际案例4. 注意事项5. 总结1. 基础概念Qt 中的 isHidd

QT移植到RK3568开发板的方法步骤

《QT移植到RK3568开发板的方法步骤》本文主要介绍了QT移植到RK3568开发板的方法步骤,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录前言一、获取SDK1. 安装依赖2. 获取SDK资源包3. SDK工程目录介绍4. 获取补丁包二

Qt把文件夹从A移动到B的实现示例

《Qt把文件夹从A移动到B的实现示例》本文主要介绍了Qt把文件夹从A移动到B的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录如何移动一个文件? 如何移动文件夹(包含里面的全部内容):如何删除文件夹:QT 文件复制,移动(