Qt 之 简单截图功能(一)实现鼠标选中区域截图
2017-01-05 23:18
986 查看
一、简述
之前用Qt实现了类似于QQ的截图功能,由于代码太多,一下子不一定明白,今天就用一个简单的小例子来看一看如何用Qt实现一个简单的截图功能。此篇文章中代码很简单,功能也比较简单,在后续的文章中将会逐步完善。先看来一下简单的效果图。效果图
正向截取
反向截取
上图是通过点击截图按钮,然后选择区域,按下Enter键进行截图并显示到主窗口中。
其实实现截图的原理很简单,就是事先截取整个屏幕,然后根据鼠标选择区域进行截取,主要难点在于获取选中的区域,此篇中获取选中区域代码较为简单,存在一定的问题,后续会详细讲解,并加以完善。
下面是目前已经实现的效果。
已完成效果
二、代码之路
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 之 简单截图功能(三)实现可拖拽选中区域
- Qt 之 简单截图功能(二)实现可移动选中区域
- Qt4简单截图功能的实现
- Qt4.8.2 实现简单的界面换肤功能
- Qt5:Qt中屏幕或窗口截图功能的实现
- 截图功能实现(二)如何框选区域
- 请教方法和例子:VS2003的datagrid控件,如何实现用鼠标拖动的方法选中任意区域的多个单元格,然后进行统一编辑??
- 简单截图功能实现
- 使用Autohotkey 实现简单的全局鼠标手势功能
- Qt实现屏保功能,鼠标一定时间无响应程序进入待机状态
- WinForm--(简单的实现鼠标矩形多选框选中)
- 非常简单的 何实现鼠标滑过小图切换大图功能
- 最简单的代码实现禁止鼠标右键及选中网页中的文字,支持Firefox,亲测可用
- Qt5:Qt中屏幕或窗口截图功能的实现
- 截图功能的简单实现
- JS实现页面table鼠标移动改变tr行颜色,单击tr选中复选框功能
- Qt4.8.2 实现简单的界面换肤功能
- Qt Quick Widgets App中简单功能的实现(新建,保存,另存为等)
- 对 QT 简单QDate的选中事件实现!
- Qt中截图功能的实现