Qt의 간단한 캡처 기능 (1) 마우스 선택 영역 캡처
8719 단어 Qt의캡처 어플리케이션 구현
약술
이전에 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의 간단한 캡처 기능 구현(一)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Qt로 문자와 이미지의 혼합 텍스트 그리기텍스트를 그리려면 QPainter::drawText 함수를 사용하지만 텍스트와 동시에 이미지 (아이콘 등)를 함께 그리기를 원합니다. QLabel와 QPushButton는 이미지와 텍스트를 표시하는 기능을 가지고 있...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.