FluentUI/src/Screenshot.cpp

80 lines
2.9 KiB
C++
Raw Normal View History

2023-08-16 18:05:49 +08:00
#include "Screenshot.h"
#include <QGuiApplication>
#include <QScreen>
#include <QQuickWindow>
2023-08-17 22:06:26 +08:00
#include <QDir>
#include <Def.h>
2023-08-17 17:14:31 +08:00
#include <QtMath>
2023-08-16 18:05:49 +08:00
Screenshot::Screenshot(QQuickItem* parent) : QQuickPaintedItem(parent)
{
2023-08-17 17:14:31 +08:00
_desktopGeometry = qApp->primaryScreen()->virtualGeometry();
2023-08-16 22:23:58 +08:00
maskColor(QColor(0,0,0,80));
2023-08-16 18:05:49 +08:00
start(QPoint(0,0));
end(QPoint(0,0));
connect(this,&Screenshot::startChanged,this,[=]{update();});
connect(this,&Screenshot::endChanged,this,[=]{update();});
}
void Screenshot::paint(QPainter* painter)
{
painter->save();
2023-08-16 22:23:58 +08:00
painter->fillRect(_desktopGeometry,_maskColor);
2023-08-16 18:05:49 +08:00
painter->setCompositionMode(QPainter::CompositionMode_Clear);
painter->fillRect(QRect(_start.x(),_start.y(),_end.x()-_start.x(),_end.y()-_start.y()), Qt::black);
painter->restore();
}
2023-08-16 23:25:52 +08:00
ScreenshotBackground::ScreenshotBackground(QQuickItem* parent) : QQuickPaintedItem(parent)
{
2023-08-17 17:14:31 +08:00
_devicePixelRatio = qApp->primaryScreen()->devicePixelRatio();
2023-08-16 23:25:52 +08:00
_desktopGeometry = qApp->primaryScreen()->virtualGeometry();
_desktopPixmap = qApp->primaryScreen()->grabWindow(0, _desktopGeometry.x(), _desktopGeometry.y(), _desktopGeometry.width(), _desktopGeometry.height());
2023-08-17 17:14:31 +08:00
int w = qApp->primaryScreen()->geometry().width();
int h = qApp->primaryScreen()->geometry().height();
foreach (auto item, qApp->screens()) {
if(item != qApp->primaryScreen()){
w = w + item->geometry().width()/qApp->primaryScreen()->devicePixelRatio();
}
}
setWidth(w);
setHeight(h);
2023-08-16 23:25:52 +08:00
}
void ScreenshotBackground::paint(QPainter* painter)
{
painter->save();
2023-08-17 19:09:56 +08:00
_sourcePixmap = QPixmap(QSize(_desktopGeometry.width(),_desktopGeometry.height()));
QPainter p(&_sourcePixmap);
2023-08-17 17:14:31 +08:00
p.drawPixmap(_desktopGeometry,_desktopPixmap);
2023-08-17 19:09:56 +08:00
painter->drawPixmap(_desktopGeometry,_sourcePixmap);
2023-08-16 23:25:52 +08:00
painter->restore();
}
2023-08-17 17:14:31 +08:00
void ScreenshotBackground::capture(const QPoint& start,const QPoint& end){
_grabResult = grabToImage();
auto x = qMin(start.x(),end.x());
auto y = qMin(start.y(),end.y());
auto w = qAbs(end.x()-start.x());
auto h = qAbs(end.y()-start.y());
_captureRect = QRect(x,y,w,h);
connect(_grabResult.data(), &QQuickItemGrabResult::ready, this, &ScreenshotBackground::handleGrabResult);
}
void ScreenshotBackground::handleGrabResult(){
2023-08-17 22:06:26 +08:00
if(_captureMode == FluScreenshotType::CaptrueMode::Pixmap){
Q_EMIT captrueToPixmapCompleted(_sourcePixmap.copy(_captureRect));
}
if(_captureMode == FluScreenshotType::CaptrueMode::File){
2023-08-17 23:03:00 +08:00
QDir dir = _saveFolder;
if (!dir.exists(_saveFolder)){
dir.mkpath(_saveFolder);
}
auto filePath = _saveFolder.append("/").append(QString::number(QDateTime::currentDateTime().toMSecsSinceEpoch())).append(".png");
qDebug()<<filePath;
2023-08-17 22:06:26 +08:00
_sourcePixmap.copy(_captureRect).save(filePath);
Q_EMIT captrueToFileCompleted(QUrl::fromLocalFile(filePath));
}
2023-08-17 17:14:31 +08:00
}