本篇介绍如何使用Qt进行屏幕或应用窗口截图。 QScreen类提供了很多与屏幕相关的API, 例如抓屏API:
QPixmap grabWindow(WId window, int x = 0, int y = 0, int w = -1, int h = -1);
传入窗口Id, 位置,宽高,如果WId是屏幕的句柄,那么截取的就是屏幕,如果WId是应用窗口的句柄,那么截取的就是应用窗口。 新建一个GUI项目,下面就把抓取的屏幕在Qt界面上显示出来, .h文件
#pragma once
#include
#include "ui_RecordScreen.h"
class RecordScreen : public QMainWindow
{
Q_OBJECT
public:
RecordScreen(QWidget *parent = Q_NULLPTR);
void paintEvent(QPaintEvent* e) override;
void timerEvent(QTimerEvent* e);
private:
Ui::RecordScreenClass ui;
QScreen* m_pScreen = nullptr;
};
头文件主要是申明一个QScreen的指针,重写绘制事件、定时器事件。
.cpp文件
#include "RecordScreen.h"
#include
#include
#include
#include
RecordScreen::RecordScreen(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
m_pScreen = QGuiApplication::primaryScreen();
startTimer(40); //1秒25帧
}
void RecordScreen::paintEvent(QPaintEvent* e)
{
//截取全屏, 指定窗口Id进行截屏
QPixmap pix = m_pScreen->grabWindow(QApplication::desktop()->winId());
//绘制截屏
QPainter p;
p.begin(this);
p.drawImage(QPoint(0, 0), pix.toImage());
p.end();
}
void RecordScreen::timerEvent(QTimerEvent* e)
{
update(); //更新窗口
}
在构造函数中先获取到QScreen对象,启动定时器;paintEvent方法中抓取屏幕,这里的窗口ID是指定的整个屏幕;定时器事件主要调用update刷新窗口。 想指定其它窗口其实也很简单,每个窗口都是QWidget, 直接调用WId方法即可获取到窗口Id, 在Win32里叫HWND窗口句柄。 运行效果如下:
除了显示屏幕动态,也可以保存为图片,调用QPixmap类save方法即可。