Qt 截屏的方法

文章介绍了如何使用Qt库通过三行代码实现截屏功能,并将截屏操作封装成一个名为ScreenCamera的类,模仿相机操作,支持帧率设置和感兴趣区域选择。这样可以方便地接入已有图像处理代码,利用的是适配器设计模式。

最近一个Qt(C++)的项目需要用到截屏的功能,就花时间研究了一下如何实现。
Qt 确实是好用,截屏只需要下面三行代码就够了。

1 QDesktopWidget *desk = QApplication::desktop();
2 QScreen * screen = QGuiApplication::primaryScreen();
3 QPixmap p = screen->grabWindow(desk->winId());

这三行代码第一行是获取桌面的窗体对象。
第二行是获得一个 QScreen 对象。
第三行是截取屏幕上窗体对象所在区域的图像。

截取的结果是个QPixmap ,如果需要进一步处理的话,可以转化为 QIamge,一行代码就可以了。

QImage image = p.toImage();

原理就这么简单,但是我将这个代码封装了一下,将截屏功能封装成了一个 Camera。一次截屏操作就相当于相机拍一张照片。这样的好处是我这里有大量的相机图像处理的代码模块。将截屏封装成相机之后,就可以非常便捷的连接我的既有代码了。这种方法在设计模式中成为“适配器模式”。

下面是代码:

  1 #ifndef SCREENCAMERA_H
  2 #define SCREENCAMERA_H
  3 
  4 #include <QThread>
  5 #include <QObject>
  6 #include <QScreen>
  7 #include <QTimer>
  8 
  9 class ScreenCamera;
 10 
 11 /**
 12  * @brief The ScreenCameraInfo class 查询屏幕相机的信息的类
 13  * 用这个类可以查到当前计算机接了几个显示器,给出每个显示器的名称(deviceName)
 14  */
 15 class ScreenCameraInfo
 16 {
 17     friend class ScreenCamera;
 18 public:
 19     explicit ScreenCameraInfo(QScreen * screen = nullptr);
 20     ScreenCameraInfo(const ScreenCameraInfo &info);
 21     /**
 22      * @brief description 没有实现,返回空字符串
 23      * @return 返回空字符串。
 24      */
 25     QString description() const;
 26     /**
 27      * @brief deviceName 给出屏幕的名称,比如 "\\\\.\\DISPLAY1", "VGA1" 一类的名称。
 28      * @return
 29      */
 30     QString deviceName() const;
 31     bool isNull() const;
 32     bool operator!=(const ScreenCameraInfo &other) const;
 33     ScreenCameraInfo &a
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值