QT realiza captura de tela

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();

}

Acho que você gosta

Origin blog.csdn.net/hulinhulin/article/details/133375726
Recomendado
Clasificación