文章目录

  • 使用Qt实现截图功能
    • 添加应用当前截图功能与信号
    • 详细代码

使用Qt实现截图功能

Qt截图有很多方法,这里不做详述,只用到截取整个屏幕的方法:

QScreen *screen = QGuiApplication::primaryScreen();

有时间还可以实现可以提取局部控件的截屏,这在一般的截图工具中都存在

参考链接:https://zhuanlan.zhihu.com/p/212230990

基本上就是使用该作者所写的内容,因为要把截图功能作为OCR软件中的一个模块,所以加了右键选项和一个信号,用于把结果发出来。

细节可以查看参考链接,这里不做详述。

添加应用当前截图功能与信号

//在右键弹出的菜单中添加一个按钮
menu->addAction("应用当前截图", this, SLOT(SelectScreen()));
//定义一个信号,用于发出截屏的图像
signals:void sig_SelectImg(QImage img);
//设置按钮的槽函数
void ScreenWidget::SelectScreen()
{int x = screen->getLeftUp().x();int y = screen->getLeftUp().y();int w = screen->getRightDown().x() - x;int h = screen->getRightDown().y() - y;close();QPixmap pix = fullScreen->copy(x, y, w, h);emit sig_SelectImg(pix.toImage());}

详细代码

screen.h

#pragma once
#pragma execution_character_set("utf-8")#include <QObject>
#include <QWidget>
#include <QMenu>
#include <QPoint>
#include <QSize>class Screen
{
public:enum STATUS {SELECT, MOV, SET_W_H};Screen() {}Screen(QSize size);void setStart(QPoint pos);void setEnd(QPoint pos);QPoint getStart();QPoint getEnd();QPoint getLeftUp();QPoint getRightDown();STATUS getStatus();void setStatus(STATUS status);int width();int height();bool isInArea(QPoint pos);          // 检测pos是否在截图区域内void move(QPoint p);                // 按 p 移动截图区域private:QPoint leftUpPos, rightDownPos;     //记录 截图区域 左上角、右下角QPoint startPos, endPos;            //记录 鼠标开始位置、结束位置int maxWidth, maxHeight;            //记录屏幕大小STATUS status;                      //三个状态: 选择区域、移动区域、设置width heightvoid cmpPoint(QPoint &s, QPoint &e);//比较两位置,判断左上角、右下角};

screen.cpp

#pragma once
#pragma execution_character_set("utf-8")#include "screen.h"
#include <QMutex>
#include <QApplication>
#include <QPainter>
#include <QDesktopWidget>
#include <QFileDialog>
#include <QEvent>
#include <QDateTime>
#include <QStringList>Screen::Screen(QSize size)
{maxWidth = size.width();maxHeight = size.height();startPos = QPoint(-1, -1);endPos = startPos;leftUpPos = startPos;rightDownPos = startPos;status = SELECT;
}int Screen::width()
{return maxWidth;
}int Screen::height()
{return maxHeight;
}Screen::STATUS Screen::getStatus()
{return status;
}void Screen::setStatus(STATUS status)
{this->status = status;
}void Screen::setEnd(QPoint pos)
{endPos = pos;leftUpPos = startPos;rightDownPos = endPos;cmpPoint(leftUpPos, rightDownPos);
}void Screen::setStart(QPoint pos)
{startPos = pos;
}QPoint Screen::getEnd()
{return endPos;
}QPoint Screen::getStart()
{return startPos;
}QPoint Screen::getLeftUp()
{return leftUpPos;
}QPoint Screen::getRightDown()
{return rightDownPos;
}bool Screen::isInArea(QPoint pos)
{if (pos.x() > leftUpPos.x() && pos.x() < rightDownPos.x() && pos.y() > leftUpPos.y() && pos.y() < rightDownPos.y()) {return true;}return false;
}void Screen::move(QPoint p)
{int lx = leftUpPos.x() + p.x();int ly = leftUpPos.y() + p.y();int rx = rightDownPos.x() + p.x();int ry = rightDownPos.y() + p.y();if (lx < 0) {lx = 0;rx -= p.x();}if (ly < 0) {ly = 0;ry -= p.y();}if (rx > maxWidth)  {rx = maxWidth;lx -= p.x();}if (ry > maxHeight) {ry = maxHeight;ly -= p.y();}leftUpPos = QPoint(lx, ly);rightDownPos = QPoint(rx, ry);startPos = leftUpPos;endPos = rightDownPos;
}void Screen::cmpPoint(QPoint &leftTop, QPoint &rightDown)
{QPoint l = leftTop;QPoint r = rightDown;if (l.x() <= r.x()) {if (l.y() <= r.y()) {;} else {leftTop.setY(r.y());rightDown.setY(l.y());}} else {if (l.y() < r.y()) {leftTop.setX(r.x());rightDown.setX(l.x());} else {QPoint tmp;tmp = leftTop;leftTop = rightDown;rightDown = tmp;}}
}

screenwidget.h

#pragma once
#pragma execution_character_set("utf-8")#include <QWidget>
#include <QWidget>
#include <QMenu>
#include <QPoint>
#include <QSize>#include "screen.h"//截屏窗口类
class ScreenWidget : public QWidget
{Q_OBJECT
public:static ScreenWidget *Instance();explicit ScreenWidget(QWidget *parent = 0);private:static QScopedPointer<ScreenWidget> self;QMenu *menu;            //右键菜单对象Screen *screen;         //截屏对象QPixmap *fullScreen;    //保存全屏图像QPixmap *bgScreen;      //模糊背景图QPoint movPos;          //坐标protected:void contextMenuEvent(QContextMenuEvent *);void mousePressEvent(QMouseEvent *);void mouseMoveEvent(QMouseEvent *);void mouseReleaseEvent(QMouseEvent *);void paintEvent(QPaintEvent *);void showEvent(QShowEvent *);signals:void sig_SelectImg(QImage img);private slots:void saveScreen();void saveFullScreen();void saveScreenOther();void saveFullOther();void SelectScreen();
};

screenwidget.cpp

//#pragma once
#pragma execution_character_set("utf-8")#include "screenwidget.h"
#include <QMutex>
#include <QApplication>
#include <QPainter>
#include <QDesktopWidget>
#include <QFileDialog>
#include <QEvent>
#include <QDateTime>
#include <QStringList>
#include <QMouseEvent>#if (QT_VERSION > QT_VERSION_CHECK(5,0,0))
#include <QScreen>
#endif#define STRDATETIME qPrintable (QDateTime::currentDateTime().toString("yyyy-MM-dd-HH-mm-ss"))QScopedPointer<ScreenWidget> ScreenWidget::self;
ScreenWidget *ScreenWidget::Instance()
{if (self.isNull()) {static QMutex mutex;QMutexLocker locker(&mutex);if (self.isNull()) {self.reset(new ScreenWidget);}}return self.data();
}ScreenWidget::ScreenWidget(QWidget *parent) : QWidget(parent)
{//this->setWindowFlags(Qt::Tool | Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint | Qt::X11BypassWindowManagerHint);menu = new QMenu(this);menu->addAction("应用当前截图", this, SLOT(SelectScreen()));menu->addAction("保存当前截图", this, SLOT(saveScreen()));menu->addAction("保存全屏截图", this, SLOT(saveFullScreen()));menu->addAction("截图另存为 ", this, SLOT(saveScreenOther()));menu->addAction("全屏另存为 ", this, SLOT(saveFullOther()));//    menu->addAction("退出截图", this, SLOT(hide()));menu->addAction("退出截图 ", this, SLOT(close()));screen = new Screen(QApplication::desktop()->size());fullScreen = new QPixmap();
}void ScreenWidget::paintEvent(QPaintEvent *)
{int x = screen->getLeftUp().x();int y = screen->getLeftUp().y();int w = screen->getRightDown().x() - x;int h = screen->getRightDown().y() - y;QPainter painter(this);QPen pen;pen.setColor(Qt::green);pen.setWidth(2);pen.setStyle(Qt::DotLine);painter.setPen(pen);painter.drawPixmap(0, 0, *bgScreen);if (w != 0 && h != 0) {painter.drawPixmap(x, y, fullScreen->copy(x, y, w, h));}painter.drawRect(x, y, w, h);pen.setColor(Qt::yellow);painter.setPen(pen);painter.drawText(x + 2, y - 8, tr("截图范围:( %1 x %2 ) - ( %3 x %4 )  图片大小:( %5 x %6 )").arg(x).arg(y).arg(x + w).arg(y + h).arg(w).arg(h));
}void ScreenWidget::showEvent(QShowEvent *)
{QPoint point(-1, -1);screen->setStart(point);screen->setEnd(point);#if (QT_VERSION <= QT_VERSION_CHECK(5,0,0))*fullScreen = fullScreen->grabWindow(QApplication::desktop()->winId(), 0, 0, screen->width(), screen->height());
#elseQScreen *pscreen = QApplication::primaryScreen();*fullScreen = pscreen->grabWindow(QApplication::desktop()->winId(), 0, 0, screen->width(), screen->height());
#endif//设置透明度实现模糊背景QPixmap pix(screen->width(), screen->height());pix.fill((QColor(160, 160, 160, 200)));bgScreen = new QPixmap(*fullScreen);QPainter p(bgScreen);p.drawPixmap(0, 0, pix);
}void ScreenWidget::saveScreen()
{int x = screen->getLeftUp().x();int y = screen->getLeftUp().y();int w = screen->getRightDown().x() - x;int h = screen->getRightDown().y() - y;QString fileName = QString("%1/screen_%2.png").arg(qApp->applicationDirPath()).arg(STRDATETIME);fullScreen->copy(x, y, w, h).save(fileName, "png");close();//QPixmap pix = fullScreen->copy(x, y, w, h);//emit sig_SelectImg(pix.toImage());
}void ScreenWidget::saveFullScreen()
{QString fileName = QString("%1/full_%2.png").arg(qApp->applicationDirPath()).arg(STRDATETIME);fullScreen->save(fileName, "png");close();
}void ScreenWidget::saveScreenOther()
{QString name = QString("%1.png").arg(STRDATETIME);QString fileName = QFileDialog::getSaveFileName(this, "保存图片", name, "png Files (*.png)");if (!fileName.endsWith(".png")) {fileName += ".png";}if (fileName.length() > 0) {int x = screen->getLeftUp().x();int y = screen->getLeftUp().y();int w = screen->getRightDown().x() - x;int h = screen->getRightDown().y() - y;fullScreen->copy(x, y, w, h).save(fileName, "png");close();}
}void ScreenWidget::saveFullOther()
{QString name = QString("%1.png").arg(STRDATETIME);QString fileName = QFileDialog::getSaveFileName(this, "保存图片", name, "png Files (*.png)");if (!fileName.endsWith(".png")) {fileName += ".png";}if (fileName.length() > 0) {fullScreen->save(fileName, "png");close();}
}void ScreenWidget::SelectScreen()
{int x = screen->getLeftUp().x();int y = screen->getLeftUp().y();int w = screen->getRightDown().x() - x;int h = screen->getRightDown().y() - y;close();QPixmap pix = fullScreen->copy(x, y, w, h);emit sig_SelectImg(pix.toImage());}void ScreenWidget::mouseMoveEvent(QMouseEvent *e)
{if (screen->getStatus() == Screen::SELECT) {screen->setEnd(e->pos());}else if (screen->getStatus() == Screen::MOV) {QPoint p(e->x() - movPos.x(), e->y() - movPos.y());screen->move(p);movPos = e->pos();}this->update();
}void ScreenWidget::mousePressEvent(QMouseEvent *e)
{int status = screen->getStatus();if (status == Screen::SELECT) {screen->setStart(e->pos());}else if (status == Screen::MOV) {if (screen->isInArea(e->pos()) == false) {screen->setStart(e->pos());screen->setStatus(Screen::SELECT);}else {movPos = e->pos();this->setCursor(Qt::SizeAllCursor);}}this->update();
}void ScreenWidget::mouseReleaseEvent(QMouseEvent *)
{if (screen->getStatus() == Screen::SELECT) {screen->setStatus(Screen::MOV);}else if (screen->getStatus() == Screen::MOV) {this->setCursor(Qt::ArrowCursor);}
}void ScreenWidget::contextMenuEvent(QContextMenuEvent *)
{this->setCursor(Qt::ArrowCursor);menu->exec(cursor().pos());
}

使用Qt实现截图功能相关推荐

  1. Qt实现微信截图功能(一)

    简述 Qt 之 简单截图功能(一)实现鼠标选中区域截图 Qt 之 简单截图功能(二)实现可移动选中区域 Qt 之 简单截图功能(三)实现可拖拽选中区域 在之前的文章中有带大家讲解过部分截图功能,有兴趣 ...

  2. Qt 之 简单截图功能(一)实现鼠标选中区域截图

    一.简述 之前用Qt实现了类似于QQ的截图功能,由于代码太多,一下子不一定明白,今天就用一个简单的小例子来看一看如何用Qt实现一个简单的截图功能.此篇文章中代码很简单,功能也比较简单,在后续的文章中将 ...

  3. Qt 局域网聊天(功能完善,界面美观,免费下载)

    Qt 局域网聊天(功能完善,界面美观,免费下载) 高清截图 登陆界面 聊天界面 GIF 登陆界面 发送消息 发送图片 设置头像 历史消息 查看名称 房间人数 调整大小 窗体全屏 截屏(最新的Ubunt ...

  4. 【Python • 项目实战】pytesseract+pyqt实现图片识别软件小项目——(二)实现QQ截图功能

    本文默认你已经学习了上一篇文章,如果你还没有学习,就赶快去学习吧.关注博主,学习更多内容. 文章目录 前言 一.任务目的 要求 二.实现截图功能 1. 截图功能分析 理论依据 1. 截图功能 2. 支 ...

  5. 基于Qt的截图工具,实现截图后进行编辑

    20220712更:新增撤销前一次编辑痕迹功能,代码中通过设置"点击行为"栈,来进行控制 基于Qt的截图工具,采用了类似QQ截图的控制面板,先上效果图. 1.基本截图 2.画箭头 ...

  6. js截屏 video_canvas与html5实现视频截图功能

    这段时间一直在研究canvas,突发奇想想做一个可以截屏视频的功能,然后把图片拉去做表情包,哈哈哈哈哈哈~~ 制作方法: 1.在页面中加载视频 在使用canvas制作这个截图功能时,首先必须保证页面上 ...

  7. JS 使用html2canvas实现截图功能的问题记录和解决方案

    JS 使用html2canvas实现截图功能的问题记录和解决方案 参考文章: (1)JS 使用html2canvas实现截图功能的问题记录和解决方案 (2)https://www.cnblogs.co ...

  8. Qt 2D绘图功能简单总结

    文章目录 Qt 2D绘图功能简单总结 Qt 2D绘图功能简单总结 Qt 的绘图功能非常强大,它可以绘制一切想要的图形,从最简单的一条直线到其他任何复杂的图形,还可以用来绘制文本和图片. Qt的绘图系统 ...

  9. 【Qt】简单Qt文本查找功能

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 程序设计 04. 执行结果 05. 附录 01. 概述 以前都用设计器设计界面,而这次我们用代码实现一个简单的查找对话框. ...

最新文章

  1. qtp9.2测试java_QTP的使用举例说明
  2. 【记录】一些非常方便的命令集合
  3. kettle 将job等导入导出成xml
  4. 怎样在Github参与一个开源项目
  5. mysql查询索引数组_mysql-索引
  6. 5.中文问题(自身,操作系统级别,应用软件的本身),mysql数据库备份
  7. php json error,PHP 7.3 中的 JSON 错误处理
  8. matlab radsimp,[转载]MATLAB学习笔记(八)
  9. 嵌入式常见笔试题总结
  10. devops 开发_DevOps如何消除开发瓶颈
  11. c++ windows编译器 amd平台_不同操作系统下的C/C++ 编译器,C/C++新手须知,零基础学习C语言...
  12. DHTML【11】--DOM
  13. 华为主题锁屏壁纸换不掉_华为手机中的这些默认设置一定要改,不然会导致手机卡顿加快耗电...
  14. 浅析MyBatis执行器原理
  15. 面向对象的数据库db4o: 初识db4o
  16. BRVAH(BaseRecyclerViewAdapterHelper)详解
  17. php生成白色背景图片
  18. 前馈神经网络初步了解
  19. 大疆精灵4rtk照片信息读取
  20. 决OBS Studio录制的视频为黑屏的问题

热门文章

  1. org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.fs.FileAlreadyExistsException)
  2. 京港澳高速韶关段发生特大交通事故 7死3伤
  3. Present Perfect Simple
  4. 剑指offer专项突击版第24天
  5. 麓言信息时尚史上影响力的十位女性设计师!
  6. MDF 海事船台显控
  7. 很有深意的12句话!
  8. 女程序员微信表白遭拒精神失常 程序员表示七夕该如何过
  9. 万里汇WorldFirst个人账号好还是公司账号好?
  10. Python程序员每月多赚20k的接私活必备网站,副业搞得那叫一个溜啊