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

news/2024/10/27 22:20:47/

一、简述

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

在这里插入图片描述

效果图

正向截取

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DW4JkmDt-1655362248991)(https://img-blog.csdn.net/20170105230928630?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvR29Gb3J3YXJkVG9TdGVw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]

反向截取

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eT1ejRDb-1655362248992)(https://img-blog.csdn.net/20170107211341768?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvR29Gb3J3YXJkVG9TdGVw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]

上图是通过点击截图按钮,然后选择区域,按下Enter键进行截图并显示到主窗口中。

其实实现截图的原理很简单,就是事先截取整个屏幕,然后根据鼠标选择区域进行截取,主要难点在于获取选中的区域,此篇中获取选中区域代码较为简单,存在一定的问题,后续会详细讲解,并加以完善。


下面是目前已经实现的效果。

已完成效果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kizldGI3-1655362248993)(https://img-blog.csdn.net/20170107212615727?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvR29Gb3J3YXJkVG9TdGVw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]


二、代码之路

capturescreen.h

#include <QWidget>
#include <QPainter>class CaptureScreen : public QWidget
{Q_OBJECTpublic:CaptureScreen(QWidget *parent = 0);~CaptureScreen();Q_SIGNALS:void signalCompleteCature(QPixmap catureImage);private:void initWindow();void loadBackgroundPixmap();void mousePressEvent(QMouseEvent *event);void mouseMoveEvent(QMouseEvent* event);void mouseReleaseEvent(QMouseEvent *event);void keyPressEvent(QKeyEvent *event);void paintEvent(QPaintEvent *event);private:bool m_isMousePress;QPixmap m_loadPixmap, m_capturePixmap;int m_screenwidth;int m_screenheight;QPoint m_beginPoint, m_endPoint;QPainter m_painter;
};

capturescreen.cpp

#include "capturescreen.h"
#include <QApplication>
#include <QDesktopWidget>
#include <QMouseEvent>CaptureScreen::CaptureScreen(QWidget *parent): QWidget(parent), m_isMousePress(false)
{initWindow();loadBackgroundPixmap();
}CaptureScreen::~CaptureScreen()
{}void CaptureScreen::initWindow()
{this->setMouseTracking(true);this->setWindowFlags(Qt::FramelessWindowHint);setWindowState(Qt::WindowActive | Qt::WindowFullScreen);
}void CaptureScreen::loadBackgroundPixmap()
{m_loadPixmap = QPixmap::grabWindow(QApplication::desktop()->winId()); //抓取当前屏幕的图片;m_screenwidth = m_loadPixmap.width();m_screenheight = m_loadPixmap.height();
}void CaptureScreen::mousePressEvent(QMouseEvent *event)
{if (event->button() == Qt::LeftButton){m_isMousePress = true;m_beginPoint = event->pos();}return QWidget::mousePressEvent(event);
}void CaptureScreen::mouseMoveEvent(QMouseEvent* event)
{if (m_isMousePress){m_endPoint = event->pos();update();}return QWidget::mouseMoveEvent(event);
}void CaptureScreen::mouseReleaseEvent(QMouseEvent *event)
{m_endPoint = event->pos();m_isMousePress = false;return QWidget::mouseReleaseEvent(event);
}void CaptureScreen::paintEvent(QPaintEvent *event)
{m_painter.begin(this);			//进行重绘;QColor shadowColor = QColor(0, 0, 0, 100);						//阴影颜色设置;m_painter.setPen(QPen(Qt::blue, 1, Qt::SolidLine, Qt::FlatCap));	//设置画笔;m_painter.drawPixmap(0, 0, m_loadPixmap);						//将背景图片画到窗体上;m_painter.fillRect(m_loadPixmap.rect(), shadowColor);			//画影罩效果;if (m_isMousePress){QRect selectedRect = getRect(m_beginPoint, m_endPoint);m_capturePixmap = m_loadPixmap.copy(selectedRect);m_painter.drawPixmap(selectedRect.topLeft(), m_capturePixmap);m_painter.drawRect(selectedRect);}m_painter.end();  //重绘结束;
}void CaptureScreen::keyPressEvent(QKeyEvent *event)
{// Esc 键退出截图;if (event->key() == Qt::Key_Escape){close();}// Eeter键完成截图;if (event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter){signalCompleteCature(m_capturePixmap);close();}
}QRect CaptureScreen::getRect(const QPoint &beginPoint, const QPoint &endPoint)
{int x, y, width, height;width = qAbs(beginPoint.x() - endPoint.x());height = qAbs(beginPoint.y() - endPoint.y());x = beginPoint.x() < endPoint.x() ? beginPoint.x() : endPoint.x();y = beginPoint.y() < endPoint.y() ? beginPoint.y() : endPoint.y();QRect selectedRect = QRect(x, y, width, height);// 避免宽或高为零时拷贝截图有误;// 可以看QQ截图,当选取截图宽或高为零时默认为2;if (selectedRect.width() == 0){selectedRect.setWidth(1);}if (selectedRect.height() == 0){selectedRect.setHeight(1);}return selectedRect;
}

测试代码

void TestWindow::onCatureImage()
{// 点击截图按钮开始截图;CaptureScreen* captureHelper = new CaptureScreen();connect(captureHelper, SIGNAL(signalCompleteCature(QPixmap)), this, SLOT(onCompleteCature(QPixmap)));captureHelper->show();
}void TestWindow::onCompleteCature(QPixmap captureImage)
{ui.label->setPixmap(captureImage);
}

以上代码实现了一个简单的截图功能,后续会完善并增加更多的功能,争取能够实现QQ截图的效果 ,敬请期待 O(∩_∩)O!

Good Night !!!


代码下载

Qt 之 实现简单截图功能(一)


http://www.ppmy.cn/news/773133.html

相关文章

Django_测试模块(六)

目录 开始写我们的第一个测试 首先得有个 Bug 创建一个测试来暴露这个 bug 运行测试 修复这个 bug 更全面的测试 测试视图 针对视图的测试 Django 测试工具之 Client 改善视图代码 测试新视图 测试 DetailView 集中管理用例文件 使用Django测试运行器 源码等资料…

wordpress 导航栏 调用 与

环境&#xff1a;wordpress6、twentytwentyone模板 一、wp-content/themes/twentytwentyone/functions.php 添加以下代码&#xff1a; 1、注册 (左边是别名&#xff0c;右边是名称。别名会用在导航栏的调用上&#xff0c;名称则显示在菜单后台页面上&#xff1a;外观->菜…

骨声纹识别解锁技术你知道吗?多种解锁方式,你觉得哪种更好?

现在&#xff0c;手机时时刻刻都陪伴在我们左右&#xff0c;手机里涉及隐私的东西也越来越多&#xff0c;并且我们也越来越注重个人隐私&#xff0c;所以我们一般都会给自己的手机设置密码。各大手机厂商也一直在手机解锁方式上不断的创新&#xff0c;所以我们今天来盘点一下现…

声纹识别,听声辨人

近年来&#xff0c;在生物识别技术领域中&#xff0c;声纹识别技术以其独特的方便性、经济性和准确性等优势受到世人瞩目&#xff0c;并日益成为人们日常生活和工作中重要且普及的安全验证方式。 声纹识别属于生物识别技术的一种&#xff0c;是一项根据语音波形中反映说话人生…

基于Pytorch实现的声纹识别模型

前言 本章介绍如何使用Pytorch实现简单的声纹识别模型&#xff0c;本项目参考了人脸识别项目的做法Pytorch-MobileFaceNet ,使用了ArcFace Loss&#xff0c;ArcFace loss&#xff1a;Additive Angular Margin Loss&#xff08;加性角度间隔损失函数&#xff09;&#xff0c;对…

骨相研究

骨相研究 A天庭骨  B枕骨   C顶骨  D项骨   F佐串骨   I眉骨  J太阳骨  K鼻骨    L颧骨 头部者&#xff0c;处一体之尊。为百骸之长。诸阳之会&#xff0c;五行之宗。一身骨相具乎面部。骨格定一世荣枯。吾在此就古人所记载的骨相、奇骨、贵骨进行图解分析。时…

声纹识别概述(2)声纹识别原理和过程

文章目录 宏观理解技术细节声纹识别发展流程传统方法深度学习的方法 多看&#xff1a;声纹识别技术简介——化繁为简的艺术&#xff0c;深入浅出了解声纹识别。 宏观理解 1、困难在哪&#xff1f; 不同的人说话语音波形不同&#xff0c;但是相同的人用不同的语调或者在不同的…

声纹识别·总章

声纹识别 1. 理论1.1 声纹识别基础1.2 声纹识别算法1.3 声纹识别数据介绍 2. 资源2.1 数据&#xff08;中文/英文&#xff09;2.2 工具KaldiTensorFlowPyTorchKeras 2.3 资源汇总语音/声纹相关书籍语音/声纹相关课程声纹识别的应用声纹识别学习路径 2.4 声纹识别大牛 3. 实战&a…