3#include <QLoggingCategory>
5#include <QDesktopServices>
9#include "ScreenCapture.h"
10#include "DlgCapture.h"
11#include "RabbitCommonTools.h"
14static Q_LOGGING_CATEGORY(log,
"Screen.Capture")
19 qDebug(log) << Q_FUNC_INFO;
22CScreenCapture::~CScreenCapture()
24 qDebug(log) << Q_FUNC_INFO;
35 qDebug(log) << Q_FUNC_INFO;
37 m_pWidget =
new QVideoWidget();
39 qCritical(log) <<
"new QVideoWidget() fail";
42 m_pWidget->setFocusPolicy(Qt::WheelFocus);
43 m_pWidget->installEventFilter(
this);
47 m_Menu.setTitle(szTitle);
48 m_Menu.setToolTip(szTitle);
49 m_Menu.setStatusTip(szTitle);
50 m_Menu.setWhatsThis(szTitle);
51 m_Menu.setIcon(plugin->Icon());
52 check = m_Menu.addAction(
53 QIcon::fromTheme(
"media-playback-start"), tr(
"Start"),
54 this, SLOT(slotStart()));
56 check = m_Menu.addAction(
57 QIcon::fromTheme(
"media-playback-stop"), tr(
"Stop"),
58 this, SLOT(slotStop()));
62 &m_ScreenCapture, &QScreenCapture::errorOccurred,
63 this, [&](QScreenCapture::Error error,
const QString &errorString){
64 qDebug(log) <<
"Capture screen error occurred:" << error << errorString;
70 &m_WindowCapture, &QWindowCapture::errorOccurred,
71 this, [&](QWindowCapture::Error error,
const QString &errorString){
72 qDebug(log) <<
"Capture windows error occurred:" << error << errorString;
79 &m_Recorder, &QMediaRecorder::errorOccurred,
80 this, [&](QMediaRecorder::Error error,
const QString &errorString) {
81 qDebug(log) <<
"Recorder error occurred:" << error << errorString;
87 &m_Recorder, &QMediaRecorder::recorderStateChanged,
88 this, [&](QMediaRecorder::RecorderState state){
89 qDebug(log) <<
"Recorder state changed:" << state;
90 if(QMediaRecorder::StoppedState == state)
91 switch(m_Parameter.m_Record.GetEndAction())
93 case CParameterRecord::ENDACTION::OpenFile:
94 QDesktopServices::openUrl(QUrl::fromLocalFile(m_szRecordFile));
96 case CParameterRecord::ENDACTION::OpenFolder: {
97 QFileInfo fi(m_szRecordFile);
98 QDesktopServices::openUrl(QUrl::fromLocalFile(fi.absolutePath()));
107 &m_Recorder, &QMediaRecorder::actualLocationChanged,
108 this, [&](
const QUrl &location){
109 qInfo(log) <<
"Recorder actual location changed:" << location;
110 m_szRecordFile = location.toLocalFile();
114 &m_ImageCapture, &QImageCapture::errorOccurred,
115 this, [&](
int id, QImageCapture::Error error,
const QString &errorString) {
116 qDebug(log) <<
"Capture image error occurred:" <<
id << error << errorString;
122 &m_ImageCapture, &QImageCapture::imageCaptured,
123 this, [&](
int id,
const QImage &image){
124 qDebug(log) <<
"Capture image:" <<
id << image;
125 QString szFile = m_Parameter.m_Record.GetImageFile(
true);
126 if(!image.save(szFile,
"PNG"))
128 qCritical(log) <<
"Capture image save to file fail." << szFile;
132 qDebug(log) <<
"Capture image to file:" << szFile;
133 switch(m_Parameter.m_Record.GetEndAction())
135 case CParameterRecord::ENDACTION::OpenFile: {
136 bool bRet = QDesktopServices::openUrl(QUrl::fromLocalFile(szFile));
138 qCritical(log) <<
"Fail: Open capture image file" << szFile;
141 case CParameterRecord::ENDACTION::OpenFolder: {
142 QFileInfo fi(szFile);
143 QDesktopServices::openUrl(QUrl::fromLocalFile(fi.absolutePath()));
171int CScreenCapture::Start()
179int CScreenCapture::Stop()
187int CScreenCapture::slotStart()
189 qDebug(log) <<
"CScreenCapture::slotStart()";
192 nRet = RC_SHOW_WINDOW(&dlg);
193 if(QDialog::Accepted != nRet)
196 int nIndex = m_Parameter.GetScreen();
197 if(m_Parameter.GetTarget() == CParameterScreenCapture::TARGET::Screen
198 && -1 < nIndex && nIndex < QApplication::screens().size()) {
199 m_ScreenCapture.setScreen(QApplication::screens().at(nIndex));
200 m_CaptureSessioin.setScreenCapture(&m_ScreenCapture);
201 m_ScreenCapture.start();
203 m_CaptureSessioin.setScreenCapture(
nullptr);
205 if(m_Parameter.GetTarget() == CParameterScreenCapture::TARGET::Window) {
206 m_CaptureSessioin.setWindowCapture(&m_WindowCapture);
207 m_WindowCapture.setWindow(m_Parameter.GetWindow());
208 m_WindowCapture.start();
210 m_CaptureSessioin.setWindowCapture(
nullptr);
212 if(m_Parameter.GetOperate() == CParameterScreenCapture::OPERATE::Record) {
213 m_CaptureSessioin.setRecorder(&m_Recorder);
214 m_Parameter.m_Record >> m_Recorder;
216 qDebug(log) <<
"Record to file:" << m_Recorder.actualLocation();
219 m_CaptureSessioin.setRecorder(
nullptr);
221 if(m_Parameter.GetOperate() == CParameterScreenCapture::OPERATE::Shot) {
222 m_CaptureSessioin.setImageCapture(&m_ImageCapture);
223 m_ImageCapture.capture();
225 m_CaptureSessioin.setImageCapture(
nullptr);
228 m_CaptureSessioin.setVideoOutput(m_pWidget);
233int CScreenCapture::slotStop()
235 qDebug(log) <<
"CScreenCapture::slotStop()";
236 if(m_Parameter.GetTarget() == CParameterScreenCapture::TARGET::Screen)
237 m_ScreenCapture.stop();
238 if(m_Parameter.GetTarget() == CParameterScreenCapture::TARGET::Window)
239 m_WindowCapture.stop();
241 if(m_Parameter.GetOperate() == CParameterScreenCapture::OPERATE::Record)
247bool CScreenCapture::eventFilter(QObject *watched, QEvent *event)
250 if(m_pWidget == watched)
252 switch(event->type()){
253 case QEvent::FocusIn:
255 qDebug(log) << Q_FUNC_INFO << event;
268 m_Parameter.SetGlobalParameters(pPara);
void sigFinished()
Successful disconnection signal.
void sigRunning()
Start success signal.
void sigError(const int nError, const QString &szError)
Triggered when an error is generated.
void sigViewerFocusIn(QWidget *pView)
The view is focus.
Q_INVOKABLE CPlugin * GetPlugin() const
Get plugin.
Global parameters of plugins.
virtual const QString DisplayName() const
The plugin display name.
virtual QWidget * GetViewer() override
Get Viewer.
virtual QDialog * OnOpenDialogSettings(QWidget *parent) override
Open settgins dialog.
virtual int Save(QSettings &set) override
Save parameters.
virtual int Load(QSettings &set) override
Load parameters.
virtual int SetGlobalParameters(CParameterPlugin *pPara) override
Apply the global parameters of the plug-in.
virtual const qint16 Version() const override
Version.
virtual int Initial() override
Initial parameters and resource.
virtual int Clean() override
Clean parameters and resource.