分两步,首先从屏幕中获取指定的区域,第二,根据指定区域抓取图片。
指定截取区域
思路:创建一个窗口类DrawScreen,让用户自己可以画出指定的区域。
DrawScreen头文件:
#ifndef DRAWSCREEN_H
#define DRAWSCREEN_H#include <QDebug>
#include <QScreen>
#include <QPainter>
#include <QShowEvent>
#include <QPaintEvent>
#include <QApplication>
#include <QMouseEvent>
#include <QMainWindow>
#include <QGuiApplication>class DrawScreen : public QMainWindow
{Q_OBJECT
public:explicit DrawScreen(QWidget *parent = nullptr);public:QPixmap pixmap;//鼠标按下时的位置QPoint pressedPos;//鼠标释放时的位置QPoint releasedPos;//鼠标当前的位置QPoint currentPos;
signals:void gotRectScreen(QRect);protected:void paintEvent(QPaintEvent*);void mousePressEvent(QMouseEvent*);void mouseReleaseEvent(QMouseEvent*);void mouseMoveEvent(QMouseEvent*);void showEvent(QShowEvent*);
};#endif // DRAWSCREEN_H
当鼠标释放时发送信号gotRectScreen(QRect),此信号的参数就是选取的屏幕区域。
DrawShow实现:
#include "drawscreen.h"
#include <QDesktopWidget>
DrawScreen::DrawScreen(QWidget *parent): QMainWindow{parent}
{this->showFullScreen();
}void DrawScreen::paintEvent(QPaintEvent*)
{QPainter painter(this);painter.setPen(QPen(Qt::red,5));if (!pixmap.isNull())painter.drawPixmap(this->rect(),pixmap);if (pressedPos.x() >=0 && pressedPos.y() >=0)painter.drawRect(QRect(pressedPos,currentPos));
}void DrawScreen::showEvent(QShowEvent *)
{pressedPos = currentPos = QPoint(-1,-1);QScreen *screen = QGuiApplication::primaryScreen();//QList<QScreen*> screens = QGuiApplication::screens();//QScreen *screen = screens.at(0);this->pixmap = screen->grabWindow(0,0,0,-1,-1);
}void DrawScreen::mousePressEvent(QMouseEvent* event)
{pressedPos = releasedPos = currentPos = event->pos();repaint();
}void DrawScreen::mouseReleaseEvent(QMouseEvent* event)
{releasedPos = event->pos();int _x,_y,_w,_h;if (releasedPos.x() > pressedPos.x()){_x = pressedPos.x();_w = releasedPos.x() - pressedPos.x();}else{_x = releasedPos.x();_w = pressedPos.x() - releasedPos.x();}if (releasedPos.y() > pressedPos.y()){_y = pressedPos.y();_h = releasedPos.y() - pressedPos.y();}else{_y = releasedPos.y();_h = pressedPos.y() - releasedPos.y();}if (_w > 0 && _h > 0)emit(gotRectScreen(QRect(_x,_y,_w,_h)));repaint();
}void DrawScreen::mouseMoveEvent(QMouseEvent* event)
{currentPos = event->pos();repaint();
}
一旦DrawShow窗口显示出来,则获取整个屏幕图片,并全屏显示图片,所以DrawShow创建时需要先隐藏。
抓取指定区域图片
创建一个窗口项目,链接gotRectScreen信号和槽函数,在槽函数中实现选取区域图片的抓取。
头文件:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QScreen>
#include <QPaintEvent>
#include <QGuiApplication>
#include <QMainWindow>#include "drawscreen.h"class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();DrawScreen *drawScreen;//用来截取屏幕,创建后需要立刻隐藏
public slots:void onGotRectScreen(QRect);//响应DrawScreen类的gotRectScreen信号(已经获取到区域)
};
#endif // MAINWINDOW_H
实现:
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{//用于确定抓取屏幕范围的类drawScreen = new DrawScreen;connect(drawScreen,&DrawScreen::gotRectScreen,this,&MainWindow::onGotRectScreen);drawScreen->hide();
}void MainWindow::onGotRectScreen(QRect rect)
{//隐藏drawScreendrawScreen->hide();//根据截取的区域抓取屏幕QScreen *screen = QGuiApplication::primaryScreen();QImage image = screen->grabWindow(0,rect.left(),rect.top(),rect.width(),rect.height()).toImage();}