Qt의 간단한 캡처 기능 (1) 마우스 선택 영역 캡처

약술


이전에 QT로 Q와 유사한 캡처 기능을 실현했는데 코드가 너무 많아서 단번에 알 수 없기 때문에 오늘은 간단한 예를 들어 Qt로 간단한 캡처 기능을 어떻게 실현하는지 보겠습니다.이 글은 코드가 간단하고 기능도 간단하여 후속 글에서 점차적으로 보완될 것이다.먼저 간단한 효과도를 살펴보자.

효과도


정방향 절취


역방향 캡처


위 그림은 캡처 버튼을 클릭하고 영역을 선택하고 Enter 키를 눌러 캡처하여 주 창에 표시합니다.
사실 캡처를 실현하는 원리는 매우 간단하다. 바로 전체 화면을 미리 캡처한 다음에 마우스에 따라 선택한 구역을 캡처하는 것이다. 주요 난점은 선택한 구역을 얻는 것이다. 이 편에서 선택한 구역 코드를 얻는 것은 비교적 간단하고 문제가 존재하기 때문에 다음에 상세하게 설명하고 보완할 것이다.
다음은 현재 이미 실현된 효과다.

완료된 효과


2. 코드의 길


capturescreen.h

#include 
#include 

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 
#include 
#include 

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의 간단한 캡처 기능 구현(一)

좋은 웹페이지 즐겨찾기