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.