Skip to content

Commit e2b7e4e

Browse files
添加部分截图构造功能
1 parent 7bc129f commit e2b7e4e

9 files changed

+141
-20
lines changed

core/screen_catcher.cpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
//
2+
// Created by wangyz38535 on 2023/10/13.
3+
//
4+
5+
#include "screen_catcher.h"
6+
#include <QApplication>
7+
#include <QDesktopWidget>
8+
9+
#include "utils/spdlog_wrapper.h"
10+
11+
QList<QList<ScreenInfo>> ScreenCatcher::CatchScreen() {
12+
QList<ScreenInfo> result;
13+
QList<QScreen*> screenList = QApplication::screens();
14+
for (auto & screen : screenList) {
15+
auto pixelRatio = screen->devicePixelRatio();
16+
QRect screenRect = screen->geometry();
17+
// 抓取一张屏幕图片
18+
QPixmap screenPixmap = screen->grabWindow(QApplication::desktop()->winId(), screenRect.x(), screenRect.y(),
19+
static_cast<int>(screenRect.width()/pixelRatio),
20+
static_cast<int>(screenRect.height()/pixelRatio));
21+
SPD_INFO("screenPix radios{0}, height{1}, width{2}", pixelRatio, screenPixmap.size().height(), screenPixmap.size().rwidth());
22+
23+
ScreenInfo screenInfo;
24+
screenInfo.object = screen;
25+
screenInfo.boundary = screenRect;
26+
screenInfo.pixmap = screenPixmap;
27+
result.append(screenInfo);
28+
}
29+
30+
QList<QList<ScreenInfo>> results;
31+
32+
for (auto& screenInfo : result) {
33+
QList<ScreenInfo> one;
34+
one.append(screenInfo);
35+
results.append(one);
36+
}
37+
38+
return results;
39+
}

core/screen_catcher.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
//
2+
// Created by wangyz38535 on 2023/10/13.
3+
//
4+
5+
#ifndef FIRESHOT_SCREEN_CATCHER_H
6+
#define FIRESHOT_SCREEN_CATCHER_H
7+
#include <QList>
8+
#include "screen_list.h"
9+
10+
/*
11+
* @brief 用来捕获所有的屏幕
12+
* */
13+
class ScreenCatcher {
14+
public:
15+
static QList<QList<ScreenInfo>> CatchScreen();
16+
};
17+
18+
19+
#endif //FIRESHOT_SCREEN_CATCHER_H

core/screen_list.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ struct ScreenInfo{
2929
class ScreenList
3030
{
3131
public:
32-
ScreenList(QList<ScreenInfo> list);
32+
explicit ScreenList(QList<ScreenInfo> list);
3333

3434
QRect allBoundary(bool isGlobal=false) const;
3535
QPixmap allPixMap() const;

core/screen_shot.cpp

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
//
22
// Created by wangyz38535 on 2023/10/12.
33
//
4+
#include <QVBoxLayout>
45
#include "utils/spdlog_wrapper.h"
56
#include "screen_shot.h"
67
#include "fireshot.h"
8+
#include "screen_catcher.h"
79

8-
ScreenShot::ScreenShot(FireShot *lpFireShot) : QObject(lpFireShot), m_lpFireShot(lpFireShot)
10+
ScreenShot::ScreenShot(FireShot *lpFireShot) : QObject(lpFireShot),
11+
m_lpFireShot(lpFireShot),
12+
m_lpWidgets(new QList<ScreenWidgets*>),
13+
m_lpUnusedWidgets(new QList<ScreenWidgets*>)
914
{
1015

1116
}
@@ -24,13 +29,50 @@ void ScreenShot::rasie() {
2429

2530
void ScreenShot::CaptureScreen(QWidget *parent) {
2631
SPD_FUNCTION();
32+
// 每次开始截图之前将原先截图数据都放置到非可用列表中,后期考虑多线程情况需要进行加锁
33+
std::copy(m_lpWidgets->begin(), m_lpWidgets->end(), std::back_inserter(*m_lpUnusedWidgets));
34+
m_lpWidgets->clear();
35+
36+
// 获取所有截图信息
37+
auto screenCaptureList = ScreenCatcher::CatchScreen();
38+
39+
// 构造截图的界面
40+
for (int32_t index = 0; index < screenCaptureList.size(); ++index) {
41+
auto screenList = screenCaptureList[index];
42+
43+
std::shared_ptr<ScreenList> alone(new ScreenList(list));
44+
ScreenWidgets* w = nullptr;
45+
if (m_lpUnusedWidgets->empty()) {
46+
SPD_DEBUG("New screen list & widget");
47+
w = new ScreenWidgets(parent);
48+
connect(w->workspace(), &Workspace::quitShot, this, &ScreenShot::finishShot, Qt::DirectConnection);
49+
connect(w->workspace(), &Workspace::finishConfirmArea, this, &ScreenShot::finishConfirmArea, Qt::DirectConnection);
50+
}
51+
52+
53+
}
54+
55+
56+
2757

2858
}
2959

3060
void ScreenShot::finishShot(int code) {
61+
SPD_FUNCTION();
62+
for (auto &w : *m_lpWidgets) {
63+
w->hide();
64+
}
65+
66+
emit ShotDone(this);
67+
68+
3169

3270
}
3371

3472
void ScreenShot::finishConfirmArea() {
73+
SPD_FUNCTION();
74+
for (auto &w : *m_lpWidgets) {
75+
w->finishConfirmArea();
76+
}
3577

3678
}

core/screen_shot.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
#include <QWidget>
1010
#include <QList>
1111
#include <memory>
12+
#include "screen_list.h"
13+
#include "screen_widget.h"
1214
//#include "widget.h"
1315

1416
class FireShot;
@@ -26,8 +28,8 @@ class ScreenShot : public QObject {
2628
void rasie();
2729

2830
private:
29-
QList<Widget*>* m_widgets;
30-
QList<Widget*>* m_unused_widgets;
31+
QList<ScreenWidgets*>* m_lpWidgets;
32+
QList<ScreenWidgets*>* m_lpUnusedWidgets;
3133

3234
signals:
3335
void ShotDone(ScreenShot*);

core/screen_widget.cpp

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,19 @@
55

66
#include "screen_widget.h"
77
#include "utils/spdlog_wrapper.h"
8-
#include "uti"
98

109
#define UNVISIABLE_X -819200
1110
#define UNVISIABLE_Y -819200
1211

13-
ScreenWidgets::ScreenWidgets(QWidget *parent) : QWidget(parent) {
14-
15-
}
16-
1712
ScreenWidgets::~ScreenWidgets() {
1813

1914
}
2015

2116

22-
ScreenWidgets::ScreenWidgets(QWidget* parent)
23-
: QWidget(parent)
24-
, m_screenlist(nullptr)
25-
, m_status("unknown")
26-
{
17+
ScreenWidgets::ScreenWidgets(QWidget* parent) : QWidget(parent),
18+
m_screenlist(nullptr),
19+
m_status("unknown"),
20+
m_workspace(this) {
2721
#ifndef USE_SPDLOG_
2822
setWindowFlags(Qt::Tool);
2923
setAttribute(Qt::WA_TranslucentBackground);
@@ -63,10 +57,10 @@ void ScreenWidgets::cleanup()
6357

6458
void ScreenWidgets::finishConfirmArea()
6559
{
66-
//if (m_workspace->areaConfirmed() == true)
67-
// m_status = "active";
68-
//else
69-
// m_status = "giveup";
60+
if (m_workspace.areaConfirmed() == true)
61+
m_status = "active";
62+
else
63+
m_status = "giveup";
7064
}
7165

7266
void ScreenWidgets::showEvent(QShowEvent* event)
@@ -152,5 +146,9 @@ void ScreenWidgets::leaveEvent(QEvent* event)
152146
QWidget::leaveEvent(event);
153147
}
154148

149+
Workspace *ScreenWidgets::workspace() {
150+
return &m_workspace;
151+
}
152+
155153

156154

core/screen_widget.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include <QPainter>
1212

1313
#include "screen_list.h"
14+
#include "screen_workspace.h"
1415

1516
class ScreenWidgets : public QWidget {
1617
Q_OBJECT
@@ -22,6 +23,7 @@ class ScreenWidgets : public QWidget {
2223
void start(std::shared_ptr<ScreenList> list, int index);
2324
void cleanup();
2425

26+
Workspace* workspace();
2527
void finishConfirmArea();
2628

2729
protected:
@@ -40,7 +42,7 @@ class ScreenWidgets : public QWidget {
4042
private:
4143
QString m_status; //unknown, active, giveup
4244
std::shared_ptr<ScreenList> m_screenlist;
43-
45+
Workspace m_workspace;
4446
};
4547

4648

core/screen_workspace.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,12 @@
33
//
44

55
#include "screen_workspace.h"
6-
#include "utils/spdlog_wrapper.h"
6+
#include "utils/spdlog_wrapper.h"
7+
8+
Workspace::Workspace(QWidget *lpWidget) {
9+
10+
}
11+
12+
Workspace::~Workspace() {
13+
14+
}

core/screen_workspace.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,19 @@
1111
#include <QFont>
1212
#include <QPushButton>
1313

14+
class Workspace : public QObject {
15+
Q_OBJECT
1416

17+
public:
18+
explicit Workspace(QWidget *lpWidget);
1519

20+
~Workspace() override;
1621

22+
signals:
23+
void quitShot(int code);
24+
void finishConfirmArea();
25+
26+
27+
}
1728

1829
#endif //FIRESHOT_SCREEN_WORKSPACE_H

0 commit comments

Comments
 (0)