Em duas etapas, primeiro obtenha a área especificada da tela e, segundo, capture a imagem com base na área especificada.
Especifique a área de interceptação
Idéia: Crie uma classe de janela DrawScreen para que os usuários possam desenhar a área especificada.
Arquivo de cabeçalho 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
Ao soltar o mouse, é enviado o sinal gotRectScreen(QRect), cujo parâmetro é a área selecionada da tela.
Implementação do 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();
}
Uma vez exibida a janela do DrawShow, a imagem inteira da tela é obtida e a imagem é exibida em tela inteira, portanto, o DrawShow precisa ser ocultado primeiro quando for criado.
Capture fotos de uma área específica
Crie um projeto de janela, vincule o sinal gotRectScreen e a função slot e implemente a captura da imagem da área selecionada na função slot.
arquivo principal:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QScreen>
#include <QPaintEvent>
#include <QGuiApplication>
#include <QMainWindow>
#include "drawscreen.h"
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
DrawScreen *drawScreen;//用来截取屏幕,创建后需要立刻隐藏
public slots:
void onGotRectScreen(QRect);//响应DrawScreen类的gotRectScreen信号(已经获取到区域)
};
#endif // MAINWINDOW_H
concluir:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
//用于确定抓取屏幕范围的类
drawScreen = new DrawScreen;
connect(drawScreen,&DrawScreen::gotRectScreen,this,&MainWindow::onGotRectScreen);
drawScreen->hide();
}
void MainWindow::onGotRectScreen(QRect rect)
{
//隐藏drawScreen
drawScreen->hide();
//根据截取的区域抓取屏幕
QScreen *screen = QGuiApplication::primaryScreen();
QImage image = screen->grabWindow(0,rect.left(),rect.top(),rect.width(),rect.height()).toImage();
}