QT编写简易截图工具

Windows和Linux下编译通过,版本5.9.1


##设计界面
新建Widget项目,进入ui设计界面,添加QLabel和两个QPushButton,布局如下:

Button重命名为pushButton_save和pushButton_snip。
加入menu如下,添加action并设置快捷键。

##创建截图窗口类

Markdown及扩展

添加新文件,选择QT Designer Form Class,如下,继承QWidget,类名修改为ScreenShot,作为截图窗口类。

##添加代码
转到mainwindow.h在类中添加重绘事件函数:

mainwindow.h

protected:void paintEvent(QPaintEvent *);

另外添加按钮和菜单的槽函数:

mainwindow.h

private slots:void on_actionSave_triggered();void on_actionCopy_triggered();void on_pushButton_snip_clicked();void on_pushButton_save_clicked();void on_actionSnip_triggered();void timerSlot();                   //定时器处理槽函数void screenShotHideSlot();          //截图窗口消失槽函数

添加成员变量:(注意要加入头文件#include screenshot.h 和 QTimer)

mainwindow.h

private:Ui::MainWindow *ui;ScreenShot *wScreen;     //截图窗口类QTimer timer;           //定时器QPixmap tmpPix;         //用于保存截图的临时变量

转到mainwindow.cpp实现成员函数
首先添加所需要用到的头文件:

mainwindow.cpp

#include "screenshot.h"
#include <QDesktopWidget>
#include <QPainter>
#include <QPixmap>
#include <QFileDialog>
#include <QMessageBox>
#include <QTimer>
#include <QClipboard>

再在构造函数中添加如下代码:

mainwindow.cpp

    this->setWindowTitle(tr("截图工具"));wScreen = new ScreenShot;wScreen->hide();     //初始化不显示QDesktopWidget *deskWidget = QApplication::desktop();QRect deskRect = deskWidget->geometry();            //获取桌面大小resize(deskRect.width() / 3, deskRect.height() / 3);//设置窗口大小connect(&timer,SIGNAL(timeout()),this,SLOT(timerSlot()));

然后分别实现其他成员函数如下:

mainwindow.cpp

//Snip按钮槽函数
void MainWindow::on_pushButton_snip_clicked()
{this->hide();   //截图开始 隐藏主窗口timer.start(20);//这里加定时器是因为窗口不会立即隐藏
}
//重绘事件函数
void MainWindow::paintEvent(QPaintEvent *)
{if(tmpPix.isNull() == false)    //若截图不为空{//将截图大小缩放到label大小 可看scaled的帮助文档QPixmap scalePix = tmpPix.scaled(ui->label->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation);//label显示截图ui->label->setPixmap(scalePix);}
}
//save按钮槽函数
void MainWindow::on_pushButton_save_clicked()
{if(tmpPix.isNull() == false)    //若截图不为空{//打开保存文件对话框QString fileName = QFileDialog::getSaveFileName(this,"save","../",tr("Images (*.png *.xpm *.jpg)"));//保存截图tmpPix.save(fileName);}else{QMessageBox::information(this,"warning","no screenshot");}
}
//定时器处理函数
void MainWindow::timerSlot()
{//首先关闭定时器timer.stop();//获取屏幕的PixmapQPixmap screen = QPixmap::grabWindow(QApplication::desktop()->winId());//绑定截图窗口关闭信号与主窗口处理槽函数connect(wScreen,SIGNAL(closeSignal()),this,SLOT(screenShotHideSlot()));//截图窗口截取屏幕wScreen->shotScreen(screen);//显示截图窗口wScreen->show();
}
//截图窗口消失处理槽函数
void MainWindow::screenShotHideSlot()
{//显示主窗口this->show();//获取截图tmpPix = wScreen->getShotPixmap();//label显示截图QPixmap scalePix = tmpPix.scaled(ui->label->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation);ui->label->setPixmap(scalePix);
}
//菜单action函数
void MainWindow::on_actionSnip_triggered()
{on_pushButton_snip_clicked();
}void MainWindow::on_actionSave_triggered()
{on_pushButton_save_clicked();
}void MainWindow::on_actionCopy_triggered()
{if(tmpPix.isNull() == true){QMessageBox::information(this,"warning","no image");return;}QClipboard *clipboard = QApplication::clipboard();clipboard->setImage(tmpPix.toImage());
}

有部分函数需要在截图窗口类ScreenShot类中实现,现在实现该类,转到screenshot.h中,添加所需头文件:

screenshot.h

#include <QPixmap>
#include <QTimer>

再添加如下成员函数和变量:

screenshot.h

public:void shotScreen(QPixmap &pix);QPixmap snipScreen(QPixmap &pix,QPoint &start,QPoint &end);QPixmap& getShotPixmap();signals:void closeSignal();protected:void paintEvent(QPaintEvent *);void mousePressEvent(QMouseEvent *e);void mouseMoveEvent(QMouseEvent *e);void mouseReleaseEvent(QMouseEvent *);private:QPoint startPoint;QPoint endPoint;QPixmap screen;QPixmap shotPix;QTimer timer;

转到screenshot.cpp实现成员函数:
添加所需头文件:

screenshot.cpp

#include <QPainter>
#include <QPixmap>
#include <QMouseEvent>
#include <QMessageBox>

在构造函数中加入:

    //设置窗口没有标题栏this->setWindowFlags(Qt::FramelessWindowHint);//定时器信号和槽connect(&timer,SIGNAL(timeout()),this,SLOT(update()));

其他函数:

screenshot.cpp

//设置截图窗口
void ScreenShot::shotScreen(QPixmap &screenPix)
{this->screen = screenPix;//设置窗口大小 和屏幕大小一致this->resize(screenPix.size());//设置遮罩this->setMask(QRegion(0,0,width(),height()));
}//绘图事件函数
void ScreenShot::paintEvent(QPaintEvent *)
{QPainter painter(this);painter.drawPixmap(0,0,screen);//设置画笔样式QPen pen;pen.setStyle(Qt::DashLine);pen.setColor(Qt::red);painter.setPen(pen);//所需截图区域用矩形框显示painter.drawRect(QRect(startPoint,endPoint));
}//鼠标事件函数
void ScreenShot::mousePressEvent(QMouseEvent *e)
{if(e->button() == Qt::LeftButton){//鼠标左键按下 设置起始点timer.start(20);startPoint = e->pos();endPoint = startPoint;}else if(e->button() == Qt::RightButton){//鼠标右键按下 隐藏截图窗口 并向主窗口发送关闭消息hide();emit closeSignal();}
}void ScreenShot::mouseMoveEvent(QMouseEvent *e)
{if(e->buttons() & Qt::LeftButton){endPoint = e->pos();}
}void ScreenShot::mouseReleaseEvent(QMouseEvent *e)
{endPoint = e->pos();if(QMessageBox::Yes == QMessageBox::question(this,"question","yes to shot?")){shotPix = snipScreen(screen,startPoint,endPoint);this->hide();startPoint = QPoint(0,0);endPoint = startPoint;emit closeSignal();}
}//截图函数
QPixmap ScreenShot::snipScreen(QPixmap &pix, QPoint &start, QPoint &end)
{int w = abs(start.x() - end.x());int h = abs(start.y() - end.y());QPixmap tmp = QPixmap(w,h);QPainter painter(&tmp);//将截图部分绘制到tmp中painter.drawPixmap(QPoint(0,0),pix,QRect(start,end));return tmp;
}//获取截图函数
QPixmap& ScreenShot::getShotPixmap()
{return shotPix;
}

##编译运行
最后编译运行结果如下:

点击按钮就可以单击鼠标左键拖动截图。
附源码下载: http://download.csdn.net/download/weddyhuo/10124652

QT编写简易截图工具相关推荐

  1. Qt实现一个简易截图工具(支持缩放、移动、保存、复制到粘贴板)

    概述 windows平台,使用Qt Widget实现一个简易截图工具,支持选区角落拖动缩放.选区移动,支持保存,复制到粘贴板,支持快捷键调出截图.退出截图.暂不支持对截图进行编辑操作,以及鼠标移动到程 ...

  2. QT编写简易的SSL证书注册工具

    前言:基于内网环境中搭建的SSL证书,想要让浏览器识别并信任它,有一步非常重要的操作就是需要用户手动将证书导入到自己的'受信任根目录'里面去.但是如果处于一个非常庞大的内网环境中,访问我们网站用户是一 ...

  3. 原生js实现canvas画布中绘制、移动、拖拽、删除矩形(如简易截图工具)

    功能描述 待图片上传并加载完成后,重新生成画布: 鼠标在画布区域内绘制,移动,拖拽,删除矩形(如截图工具一般): isboundary() 判断是否需要判断边界问题,默认false. 效果截图 实现代 ...

  4. Qt编写的开源帖子集合(懒人专用)

    回顾自己学习Qt以来九年了,在这九年多时间里面,从本论坛学习不到不少的东西,今天特意整了一下自己开源过的资源的帖子,整理一起方便大家直接跳转下载,不统计不知道,一统计吓一跳,不知不觉开源了这么多代码, ...

  5. 一键捕获,自由分享:开源截图工具盘点

    这些开源项目都是优秀的截图工具,它们在功能和易用性方面都有共同之处.无论您是需要捕获屏幕快照.录制屏幕操作还是进行图片编辑和注释,这些项目都能满足您的需求.它们提供了丰富的定制选项,使用户可以根据个人 ...

  6. 基于QT的截图工具教程

    先上视频 截图工具 运行环境:VS2019 + QT 该截图工具支持 1:直线 2:矩形 3:椭圆 4:自由笔 5:荧光笔 6:马赛克 7:橡皮擦 8:保存截图到本地 9:剪贴板 10:箭头(单向箭头 ...

  7. Qt优秀开源项目之十:开源截图工具flameshot

    这是一个功能强大的截图工具,支持的工具包括画笔.直线.箭头.矩形.椭圆.文字.马塞克,支持的操作也很丰富,具体自己去发现,上几张效果图: 最新版的还支持类似QQ的放大取色功能 外观支持定制,这个就很另 ...

  8. 文件批量下载工具(自己用QT编写)

    自己用QT编写的工具,小伙伴们随意使用. 之前因为需要从网络上下载一些图片,不想一个一个的下载,就在网上找一些可以批量下载的工具. 找了一大圈,不是收费,就是一大堆的广告. 一怒之下,决定自己搞一个下 ...

  9. Qt编写的小软件:一个模拟按键按下和鼠标(左键)按下的小工具

    最近玩SLG游戏的时候有大量对剧情推进无意义的对话想要跳过的时候只能狂按空格键或者狂点鼠标,还好本人好歹是程序员,于是写了个小工具来处理. 下载地址:Qt编写的模拟鼠标按下和按键按下的小工具-C++文 ...

最新文章

  1. 中国在线英语培训行业投资热点分析与需求前景预测报告2022版
  2. linux电视改安卓,mstar安卓智能电视方案源代码常用修改
  3. keepalive之LVS-DR架构
  4. C++中的多重继承(二)
  5. 用递归解决冒泡排序问题
  6. .net反编译工具reflector5.0 的介绍及使用
  7. springboot整合shiro之实现记住我
  8. XcodeGhost作者声明:源于实验,无任何威胁
  9. android灰度发布平台,安卓版微信灰度发布购物直播功能 小程序直播上线公域流量入口...
  10. 由于找不到 MSVCR120.dll,无法继续执行代码解决方法
  11. 我的读书笔记 -《鬼谷子》
  12. Java模拟账户---关键字this
  13. E - Ricochet Robots( dfs+hash优化 )
  14. 高并发环境如何有效缓解带宽压力
  15. 应用程序和操作系统的关系是什么
  16. 用防火墙可以防御DDoS攻击吗?
  17. BadBoy录制脚本jmeter打开
  18. 什么是好代码-代码整洁之道阅读笔记
  19. UESTC -- 1061 秋实大哥与战争(暴力/set)
  20. 互联网发展十几年,你错过了哪些创业机会

热门文章

  1. JQuery——BreakingNews.js新闻滚动效果
  2. LDAP查询数据(JAVA)
  3. N30_连续子数组的最大和
  4. 职场人加班图鉴:别人遇见了爱情,我却天天见Bug
  5. c++模板库(简介)
  6. 设计模式之美——DRY原则 和 迪米特法则
  7. vivo笔试题C语言,vivo校招笔试考什么?vivo在线测评笔试真题及答案解析来啦!...
  8. [转载]Do It Now
  9. c语言 subl 指令,linux 之 汇编语言 的mov和movl sub 和subl add 和addl 的区别??
  10. Ubuntu 16.04lts 下使用打印机器