您的位置:首页 > 编程语言 > Qt开发

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 之 实现简单截图功能(一)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: