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

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

本文介绍了一个使用Qt实现的简易截图功能。通过简单的代码示例,展示了如何捕获屏幕区域并将其显示出来。文章包括了主要类的定义及关键事件处理过程。

一、简述

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

在这里插入图片描述

效果图

正向截取

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

反向截取

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

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

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


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

已完成效果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kizldGI3-1655362248993)(https://img-blog.youkuaiyun.com/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_OBJECT

public:
	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 之 实现简单截图功能(一)

Qt 简单截图工具(一) 高仿QQ截屏 滑动截屏 闲来无聊,在学习qt几个月后突然想制作一个截屏工具来给自己使用。简单分析了一下,认为截屏方式共可以分为三种: 获取当前窗口或控件的界面保存为图片 滑动鼠标截取当前桌面显示内容 识别鼠标指向窗口。控件或图标保存为图片 阅读详情

相关推荐

Qt 实现 QQ 截图工具(开源OEasyScreenshot)

截图作为一个锦上添花的功能,我想大家一定都没有在意,可能大家忘了一件事,曾几何时你想截图的时候,第一时间想到的是打开QQ而不是其它软件?你是不是感觉到了什么?QQ的截图做的确实挺好挺细致的。我搜了一下,没有找到比较优质的内容,于是乎我就。 嘿嘿嘿~ 1 : 1 高仿,供大家学习使用。

学习是一种信仰。 1万+

利用QT实现截屏的四种方法

利用QT实现截屏的四种方法; 一:截取整个屏幕 (1)代码如下: void Test::slotGrabFullScreen() {     QScreen *screen = QGuiApplication::primaryScreen();     QString filePathName = "full-";     filePathName += QDateT

huangqi734044860的专栏 5万+

Qt4简单截图功能的实现

截图是一个非常常见的功能。但是Windows自带的截图功能我们发现并不好用。所以很多时候我们打开QQ就是为了做一个截图。QQ的截图功能还是非常强大的,今天,我将用Qt4手工做一个简单的截图。这个截图比不上QQ的截图,只实现了基本功能。没有复杂的操作,供大家学习、参考。

Edmund_LazyCat的博客 2553

使用Qt实现截图功能

文章目录使用Qt实现截图功能添加应用当前截图功能与信号详细代码 使用Qt实现截图功能 Qt截图有很多方法,这里不做详述,只用到截取整个屏幕的方法: QScreen *screen = QGuiApplication::primaryScreen(); 有时间还可以实现可以提取局部控件的截屏,这在一般的截图工具中都存在 参考链接:https://zhuanlan.zhihu.com/p/212230990 基本上就是使用该作者所写的内容,因为要把截图功能作为OCR软件中的一个模块,所以加了右键选项和一

ShareProgress的博客 1万+

基于QT开发的截图工具

概述这是一个使用QT设计的截图工具

qiuzhiqian1990的博客 6617

Qt项目中,实现屏幕截图功能的模块详细实现(可通用)

总第52篇屏幕截图功能,在很多软件中都有使用。本文主要梳理一下这个功能的实现,方便在以后的项目中快速移植,对于这方面不太熟悉的,也可以参考一下其实现方式。程序的实现效果图,见文章末尾。头文件主要包含两个类,一个是截屏对象类,另一个是截屏窗口类,在截屏窗口中调用截屏对象。其详细的变量、方法定义如下:#ifndef SCREENWIDGET_H #define SCREENWIDGET_H #inc...

实战开发者Airex 1681

Qt 之 简单截图功能(三)实现可拖拽选中区域

一、简述在 Qt 之 简单截图功能(一)实现鼠标选中区域截图 、 Qt 之 简单截图功能(二)实现可移动选中区域 中简单叙述了实现截图功能的两小步,今天第三篇来实现可拖拽选中矩形顶点进行重新选择截图区域,话不多说先看效果图,再上代码。效果图:二、代码之路这一篇中将实现实现如何通过鼠标拖拽重新选取截图区域。代码可能稍长,整体代码是在前两篇的基础上完善的,建议先从 Qt 之 简单截图功能(一)实现鼠标选......

前行之路还需前行 1万+

Qt通用截图截屏实现

在Qt中,实现通用的截图截屏功能是一项十分常见的需求。本文将介绍如何使用Qt实现通用的截图截屏,并提供相应的源代码。使用以上方法即可轻松实现通用的截图截屏,且能够应对多种不同的场景需求。其中,x、y、w、h为所需要的区域的坐标和大小。Qt通用截图截屏实现。

DevAstro的博客 1209

Qt 之 简单截图功能(二)实现可移动选中区域

一、简述在 Qt 之 实现简单截图功能(一) 中我们简单介绍了截图,也实现了简单截图,但是截完图片后不可以继续移动选中区域,这一篇中将讲述在选取完截图区域后可再次用鼠标拖动移动选中区域。效果图:二、代码之路capturescreen.h#include #include enum CaptureState{ initCapture, begi......

前行之路还需前行 1万+

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

一个简单的小例子来看一看如何用Qt实现一个简单的截图功能,详情见博客 http://blog.youkuaiyun.com/goforwardtostep/article/details/54099742

深入解析NPN与PNP传感器驱动电路的设计逻辑与实战应用

本文深入解析NPN与PNP传感器驱动电路的设计逻辑与实战应用,详细对比两者的电流路径差异和电平变化特性。通过实际案例分享电路设计要点,包括上拉电阻选择、保护二极管配置等,并提供工业应用中的选型策略和常见故障排查指南,帮助工程师优化传感器系统集成。

weixin_42561476的博客 471

基于QT的截图

一、鼠标选中区域截图简述    之前用Qt实现了类似于QQ的截图功能,由于代码太多,一下子不一定明白,今天就用一个简单的小例子来看一看如何用Qt实现一个简单的截图功能。此篇文章中代码很简单,功能也比较简单,在后续的文章中将会逐步完善。先看来一下简单的效果图。正向截取效果图:正向截取效果图:    上图是通过点击截图按钮,然后选择区域,按下Enter键进行截图并显示到主窗口中。实实现截图的原理很简单...

samson 1276

generate for与always内for:Verilog循环的静态生成与动态执行之辨

本文深入解析Verilog中generate for与always内部for循环的核心差异。generate for使用genvar变量在编译时静态生成硬件结构,适用于模块实例化;always内部for使用整型变量在运行时动态执行,综合为并行逻辑。理解这两种循环的适用场景和综合结果对提升数字电路设计质量至关重要。

yog99的博客 1087

QT实现图片缩放的同时随意框选区域并保存截图

这篇文章是基于我之前写的文章《QT下实现图片的自适应显示、缩放(以鼠标位置为中心进行缩放)、拖动、以及重置》https://blog.youkuaiyun.com/weixin_43935474/article/details/89327314#comments 之前的文章里说过自己重写了QGraphicsItem类(自己的类命名为ImageWidget),从而实现的图片的缩放,拖动,及重置显示。 这篇文章里...

weixin_43935474的博客 4516

电力电子技术(13)——大功率可控整流电路

目录引言2.6.1 带平衡电抗器的双反星形可控整流电路电路结构的特点接平衡电抗器的原因平衡电抗器使得两组三相半波整流电路同时导电的原理分析谐波分析2.6.2 多重化整流电路概述原理目标1)移相多重联结2)多重联结电路的顺序控制3重晶闸管整流桥顺序控制带平衡电抗器的双反星形可控整流电路(是多重化整流电路的重要形式之一)的特点:适用于低电压、大电流的场合。多重化整流电路的特点:绕组的极性相反的目的:消除直流磁通势如图所示,虽然两组相电流的瞬时值不同,但是平均电流相等而绕组的极性相反,所以直流安匝(电流*匝数)互

weixin_45589295的博客 1万+

基于价值的深度强化学习:DQN

本文主要是介绍DQN原理和算法伪代码和代码实现,算法实现包括pytorch版本和stable-baselines3版本

溯源的专栏 1085

QT 截图

QT 截图 一、简要说明     简单的实现截图功能,包括全屏截图,矩形区域截图,主要环境:win7-32bit,QT Creator5.2。    (2019年01月17日在Win7-64bit,QTCreator5.7修改)     工程源代码 链接: https://pan.baidu.com/s/1Ucd5XXCa6VQhPD4zzJJNJw 提取码: fxu2 二、效果 运行...

Genven_Liang的博客 4493

实战解析:在.NET中实现Dify API流式请求与响应的完整方案

本文详细解析了在.NET应用中对接Dify API时实现流式请求与响应的完整方案。针对传统后端“接收完才返回”的痛点,文章提供了基于ASP.NET Core的实战代码,通过配置HttpCompletionOption.ResponseHeadersRead和手动Flush响应流,构建高效的中转管道,确保AI回复能够像ChatGPT一样实时逐字推送到前端,显著提升用户体验。

weixin_29267307的博客 296

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

使用Qt实现微信截图部分功能,Qt虽然不是无所不能,但是我们可以尽其所能。

前行之路还需前行 3032

CloudCompare里那个CSF地面滤波插件,到底怎么用?手把手教你分离点云里的地面

本文详细介绍了如何在CloudCompare中使用CSF地面滤波插件分离点云中的地面数据。通过解析布料模拟滤波算法的核心参数,如布料刚度和网格分辨率,并提供不同地形(城市、丘陵、山地)的适配策略,帮助用户高效处理复杂点云数据。文章还包含实战案例和优化技巧,确保滤波结果的精度和可靠性。

weixin_42548708的博客 221

Android TV开发:RecyclerView焦点控制实践与优化

在Android TV应用开发中,焦点控制是提升用户体验的关键技术。不同于移动端触摸交互,TV端通过遥控器方向键导航,需要精确的焦点管理机制。RecyclerView作为动态列表的核心组件,其焦点控制涉及视图复用、导航逻辑和视觉反馈等核心技术点。通过合理配置focusable属性、自定义焦点查找算法以及优化动画性能,开发者可以解决TV端常见的焦点跳转异常、视觉反馈延迟等问题。特别是在视频点播、智能家居控制等场景中,良好的焦点控制能显著提升操作效率。本文结合网格布局焦点环绕、分页加载焦点保持等实战案例,深入解

weixin_34195142的博客 469

QT截图程序,可多屏幕截图二,增加调整截图区域功能

截屏增加动态调整边框功能

gdizcm的专栏 1182

Cesium 实战 26 - 自定义纹理材质 - 箭头流动线(图片纹理)

Cesium 实战 - 自定义纹理材质 - 箭头流动线(图片纹理)。

非科班Java出身GISer的博客 1404

Qt中截图功能的实现

提要需求:加载一张图片并显示,可以放大缩小,可以截取图片的某个矩形并保存。原以为蛮简单的一个功能,其实还是有点小复杂。最简单Qt图片浏览器可以参考Qt自带的Demo:Image Viewer Example - http://qt-project.org/doc/qt-4.8/widgets-imageviewer.html看一下最终的实现效果:图片的加载显示这里需要实现一个QImageViewe

爱冒险的技术宅 1万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Qt实现最简单的截图工具

ShotScreenDialog.h #ifndef SHOTDIALOG_H #define SHOTDIALOG_H #include <QPixmap> #include <QDialog> #include <QToolBar> #include <QPushButton> namespace Ui { class ShotS...

qq_22302267的博客 1538

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

上一篇: Qt 之 模仿 QQ登陆界面——功能篇(一)
下一篇: Qt 之 简单截图功能(二)实现可移动选中区域
前行中的小猪
前行中的小猪 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄10年 4万+粉丝 134原创
评论 47
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值