Kstars

screencapture.cpp
1/*
2 SPDX-FileCopyrightText: 2025 Hy Murveit <hy@murveit.com>
3
4 SPDX-License-Identifier: GPL-2.0-or-later
5*/
6
7#include "screencapture.h"
8#include <QGuiApplication>
9#include <QThread>
10
11ScreenCapture::ScreenCapture(QWidget *parent) : QWidget(parent), rubberBand(nullptr)
12{
14 setGeometry(QGuiApplication::primaryScreen()->geometry());
15 setAttribute(Qt::WA_TranslucentBackground);
16 setAttribute(Qt::WA_NoSystemBackground);
17 setCursor(Qt::CrossCursor);
18}
19
20ScreenCapture::~ScreenCapture()
21{
23}
24
25void ScreenCapture::showEvent(QShowEvent *event)
26{
29}
30
31void ScreenCapture::hideEvent(QHideEvent *event)
32{
35}
36void ScreenCapture::mousePressEvent(QMouseEvent *event)
37{
38 origin = event->pos();
39 if (!rubberBand)
40 {
41 rubberBand = new QRubberBand(QRubberBand::Rectangle, this);
42 rubberBand->setStyleSheet("border: 2px solid red;");
43 }
44 rubberBand->setGeometry(QRect(origin, QSize()));
45 rubberBand->show();
46}
47
48void ScreenCapture::mouseMoveEvent(QMouseEvent *event)
49{
50 if (rubberBand)
51 {
52 rubberBand->setGeometry(QRect(origin, event->pos()).normalized());
53 }
54}
55
56void ScreenCapture::mouseReleaseEvent(QMouseEvent *event)
57{
58 Q_UNUSED(event);
59 if (rubberBand)
60 {
61 QRect selectedRect = rubberBand->geometry();
62 rubberBand->hide();
63 close();
64 QRect rect(selectedRect.left() + geometry().left(),
65 selectedRect.top() + geometry().top(),
66 selectedRect.width(), selectedRect.height());
67 hide();
69 // Instead of this, I can create an event filter for the CaptureWidget,
70 // and look for the Paint event, emit a signal, and only grabWindow after that.
71 // bool eventFilter(QObject *watched, QEvent *event) override {
72 // if (event->type() == QEvent::Paint) {
73 // emit paintCompleted(); // Signal emitted when repainting is done
74 // }
75 // return QWidget::eventFilter(watched, event);
76 // }
77 QThread::msleep(100);
79 if (!screen)
80 emit aborted();
81 else
82 {
83 QPixmap screenshot = screen->grabWindow(0, rect.x(), rect.y(), rect.width(), rect.height());
84 emit areaSelected(screenshot.toImage());
85 }
86 }
87}
88
89void ScreenCapture::keyPressEvent(QKeyEvent *event)
90{
91 if (event->key() == Qt::Key_Escape)
92 {
94 close();
95 emit aborted();
96 }
97 else
98 {
99 QWidget::keyPressEvent(event); // Pass other keys to base class
100 }
101}
void processEvents(QEventLoop::ProcessEventsFlags flags)
QImage toImage() const const
int height() const const
int left() const const
int top() const const
int width() const const
CrossCursor
Key_Escape
WA_TranslucentBackground
FramelessWindowHint
QTextStream & left(QTextStream &stream)
void msleep(unsigned long msecs)
bool close()
void unsetCursor()
virtual bool event(QEvent *event) override
void grabKeyboard()
void hide()
virtual void hideEvent(QHideEvent *event)
virtual void keyPressEvent(QKeyEvent *event)
void releaseKeyboard()
QScreen * screen() const const
virtual void showEvent(QShowEvent *event)
This file is part of the KDE documentation.
Documentation copyright © 1996-2025 The KDE developers.
Generated on Fri Apr 25 2025 11:58:33 by doxygen 1.13.2 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.