Qt5.5制作简单的屏幕截图程序
2015-11-19 18:09
495 查看
这一次,来写一个简单的屏幕截图程序。
屏幕截图的核心是使用QPixmap::grabWindow()方法。该方法的声明(参见Qt文档)如下:
文档中的解释是:Creates and returns a pixmap constructed by grabbing the contents of the given window restricted by QRect(x, y, width, height).就是创建并返回一个给定窗口内的指定矩形区域的内容截图。其中的WId就是给定的窗口ID,要想抓取屏幕(desktop)的内容,就必须传递屏幕窗口的ID。这个ID可以使用
来获取。不过在使用的时候需要包含#include <QDesktopWidget>头文件。
通过上面的方法可以获取到屏幕的相应区域的内容截图(获取到的是一个QPixmap对象),获取了这个图片以后,接下来需要处理三个问题:
(1)截图时隐藏程序主窗体;
(2)如何使用鼠标来决定要截图的屏幕区域大小(这一步可以重载鼠标移动事件);
(3)截取图像的保存以及放入到剪切板中,在之后可以使用Ctrl+V进行粘贴;
(1)截图时隐藏程序主窗体
这个可以再响应开始截图的响应信号或事件(如QAction)的响应处理函数中使用主窗体的hide()函数,在截图完成之后向主窗体发送一个信号,在这个信号的处理函数中调用主窗体的show()函数。
(2)使用鼠标来获取屏幕的指定区域
使用WINDOWS API开发时,可以程序窗口外的屏幕(desktop)上进行绘制操作,就是获取屏幕的HDC,还可以获取鼠标在屏幕上的移动位置,使用这个方法可以非常简单的在屏幕上绘制要截图的区域(根据鼠标在屏幕上点击的位置,在屏幕上绘制一个矩形,来表示要截图的区域)。
但是Qt中并没提供以上的方法,其绘制类QPainter并没可以获取屏幕设备的方法,同时也很难获取鼠标在屏幕上的移动事件。所以需要另辟蹊径,其实方法很简单。
可以创建一个屏幕大小的窗体,在将窗体指定为无边框、半透明(我测试的时候在全透明的状况下,好像无法捕捉到鼠标的点击事件),这样就可以在这个窗体上绘制截图区域,以及捕获鼠标的点击事件。
下面是用来模拟窗体半透明
(3)截图的保存和放入剪切板
保存的时候只需要调用QPixmap对象的save()函数即可。
对于剪切板的使用需要包含#include <QClipboard>。
以上就是实现一个简单的截图程序的方法。下面是程序运行的截图:
![](http://images2015.cnblogs.com/blog/731072/201511/731072-20151119175918249-424844785.jpg)
![](http://images2015.cnblogs.com/blog/731072/201511/731072-20151119180420202-239873660.jpg)
![](http://images2015.cnblogs.com/blog/731072/201511/731072-20151119180448811-611254906.png)
![](http://images2015.cnblogs.com/blog/731072/201511/731072-20151119180509999-828482870.jpg)
程序源代码下载连接:http://pan.baidu.com/s/1gdHd6gj
屏幕截图的核心是使用QPixmap::grabWindow()方法。该方法的声明(参见Qt文档)如下:
QPixmap QPixmap::grabWindow(WId window, int x = 0, int y = 0, int width = -1, int height = -1)
文档中的解释是:Creates and returns a pixmap constructed by grabbing the contents of the given window restricted by QRect(x, y, width, height).就是创建并返回一个给定窗口内的指定矩形区域的内容截图。其中的WId就是给定的窗口ID,要想抓取屏幕(desktop)的内容,就必须传递屏幕窗口的ID。这个ID可以使用
QApplication::desktop()->winId()
来获取。不过在使用的时候需要包含#include <QDesktopWidget>头文件。
通过上面的方法可以获取到屏幕的相应区域的内容截图(获取到的是一个QPixmap对象),获取了这个图片以后,接下来需要处理三个问题:
(1)截图时隐藏程序主窗体;
(2)如何使用鼠标来决定要截图的屏幕区域大小(这一步可以重载鼠标移动事件);
(3)截取图像的保存以及放入到剪切板中,在之后可以使用Ctrl+V进行粘贴;
(1)截图时隐藏程序主窗体
这个可以再响应开始截图的响应信号或事件(如QAction)的响应处理函数中使用主窗体的hide()函数,在截图完成之后向主窗体发送一个信号,在这个信号的处理函数中调用主窗体的show()函数。
connect(newpic_,&QAction::triggered,this,&MainWindow::new_pic); connect(savepic_,&QAction::triggered,this,&MainWindow::save_pic);
void MainWindow::new_pic() { Dialog dlg; connect(&dlg,&Dialog::finish,this,&MainWindow::jietu); connect(&dlg,&Dialog::closeF,this,&MainWindow::showF); this->hide(); dlg.exec(); } void MainWindow::showF() { this->show(); }
(2)使用鼠标来获取屏幕的指定区域
使用WINDOWS API开发时,可以程序窗口外的屏幕(desktop)上进行绘制操作,就是获取屏幕的HDC,还可以获取鼠标在屏幕上的移动位置,使用这个方法可以非常简单的在屏幕上绘制要截图的区域(根据鼠标在屏幕上点击的位置,在屏幕上绘制一个矩形,来表示要截图的区域)。
但是Qt中并没提供以上的方法,其绘制类QPainter并没可以获取屏幕设备的方法,同时也很难获取鼠标在屏幕上的移动事件。所以需要另辟蹊径,其实方法很简单。
可以创建一个屏幕大小的窗体,在将窗体指定为无边框、半透明(我测试的时候在全透明的状况下,好像无法捕捉到鼠标的点击事件),这样就可以在这个窗体上绘制截图区域,以及捕获鼠标的点击事件。
setWindowFlags(Qt::FramelessWindowHint); setAttribute(Qt::WA_TranslucentBackground); QWidget * desktop=QApplication::desktop()->screen(); resize(desktop->width(),desktop->height()); this->setMouseTracking(true);
下面是用来模拟窗体半透明
int alpha=1; QPainter paint(this); paint.fillRect(0, 0, width(), height(), QColor(0, 0, 0, alpha)); QPen pen(Qt::red,2); paint.setPen(pen); paint.drawRect(pt1.x(), pt1.y(), pt2.x()-pt1.x(), pt2.y()-pt1.y());
(3)截图的保存和放入剪切板
保存的时候只需要调用QPixmap对象的save()函数即可。
对于剪切板的使用需要包含#include <QClipboard>。
QClipboard * clipborder=QApplication::clipboard(); clipborder->setPixmap(this->pic);
以上就是实现一个简单的截图程序的方法。下面是程序运行的截图:
![](http://images2015.cnblogs.com/blog/731072/201511/731072-20151119175918249-424844785.jpg)
![](http://images2015.cnblogs.com/blog/731072/201511/731072-20151119180420202-239873660.jpg)
![](http://images2015.cnblogs.com/blog/731072/201511/731072-20151119180448811-611254906.png)
![](http://images2015.cnblogs.com/blog/731072/201511/731072-20151119180509999-828482870.jpg)
程序源代码下载连接:http://pan.baidu.com/s/1gdHd6gj
相关文章推荐
- Qt中快捷键使用
- Qt环境下利用OpenGL显示三维模型
- Qt Creator 调试器未设置的解决办法(转
- Qt 容器类学习
- QtCreator下复制文件夹的一个BUG
- QtCreator下资源路径设置
- Qwt 折线图 波形图 柱状图示例效果
- QT QPushButton点击事件的实现
- Ⅰ.2.6.8 如何测试QTable (Qt 3)
- QTextEidt添加图片
- QTextEidt添加图片 拖动图片
- QTextEdit中添加图片
- Ⅰ.2.6.7 如何测试QListView (Qt 3)
- Qt之窗体透明
- 使用Qt正则表达式提取全路径的文件名
- QT: :QWheelEvent
- QT 应用程序关闭某个窗口时,关闭打开的所有其他窗口并退出程序
- Qt应用程序的发布 exe文件图标设置
- Qt入门-提示、警告、错误、询问、关于对话框
- Qt之操作数据库(SQLite)