3#include <QLoggingCategory>
4#include <QDesktopServices>
7#include <QWidgetAction>
10#include "ConnecterThread.h"
11#include "ConnectThread.h"
12#include "PluginClient.h"
14static Q_LOGGING_CATEGORY(log,
"Client.Connecter.Thread")
19 , m_pFrmViewer(
nullptr)
21 , m_pZoomToWindow(
nullptr)
22 , m_pZoomAspectRatio(
nullptr)
23 , m_pZoomOriginal(
nullptr)
26 , m_psbZoomFactor(
nullptr)
27 , m_pScreenShot(
nullptr)
30 , m_pRecordPause(
nullptr)
33 qDebug(log) << Q_FUNC_INFO;
36CConnecterThread::~CConnecterThread()
38 qDebug(log) << Q_FUNC_INFO;
43 qDebug(log) << Q_FUNC_INFO;
50 Q_ASSERT(!(m_pFrmViewer && m_pScroll));
60 qDebug(log) << Q_FUNC_INFO;
72int CConnecterThread::InitialMenu()
77 QMenu* pMenuZoom =
new QMenu(&m_Menu);
78 pMenuZoom->setTitle(tr(
"Zoom"));
79 pMenuZoom->setIcon(QIcon::fromTheme(
"zoom"));
80 m_pMenuZoom = m_Menu.addMenu(pMenuZoom);
81 m_pZoomToWindow = pMenuZoom->addAction(
82 QIcon::fromTheme(
"zoom-fit-best"), tr(
"Zoom to window"));
83 m_pZoomToWindow->setCheckable(
true);
84 check = connect(m_pZoomToWindow, &QAction::toggled,
this,
86 m_pScroll->slotSetAdaptWindows(
90 m_pZoomAspectRatio = pMenuZoom->addAction(
91 QIcon::fromTheme(
"zoom-aspect-ratio"),
92 tr(
"Keep aspect ration to windows"));
93 m_pZoomAspectRatio->setCheckable(
true);
94 check = connect(m_pZoomAspectRatio, &QAction::toggled,
this,
96 m_pScroll->slotSetAdaptWindows(
100 m_pZoomOriginal = pMenuZoom->addAction(
101 QIcon::fromTheme(
"zoom-original"), tr(
"Original"));
102 m_pZoomOriginal->setCheckable(
true);
103 check = connect(m_pZoomOriginal, &QAction::toggled,
this,
105 m_pScroll->slotSetAdaptWindows(
109 m_pZoomIn = pMenuZoom->addAction(QIcon::fromTheme(
"zoom-in"), tr(
"Zoom in"));
110 m_pZoomIn->setCheckable(
true);
112 m_pZoomIn, &QAction::toggled,
this,
115 m_psbZoomFactor->setValue((m_pFrmViewer->
GetZoomFactor() + 0.1) * 100);
118 m_pZoomOut = pMenuZoom->addAction(
119 QIcon::fromTheme(
"zoom-out"), tr(
"Zoom out"));
120 m_pZoomOut->setCheckable(
true);
122 m_pZoomOut, &QAction::toggled,
this,
125 m_psbZoomFactor->setValue((m_pFrmViewer->
GetZoomFactor() - 0.1) * 100);
128 QActionGroup* pGBViewZoom =
new QActionGroup(
this);
130 pGBViewZoom->addAction(m_pZoomToWindow);
131 pGBViewZoom->addAction(m_pZoomAspectRatio);
132 pGBViewZoom->addAction(m_pZoomOriginal);
133 pGBViewZoom->addAction(m_pZoomIn);
134 pGBViewZoom->addAction(m_pZoomOut);
136 m_psbZoomFactor =
new QSpinBox(pMenuZoom);
137 m_psbZoomFactor->setRange(0, 9999999);
138 m_psbZoomFactor->setValue(100);
139 m_psbZoomFactor->setSuffix(
"%");
140 m_psbZoomFactor->setEnabled(
false);
141 m_psbZoomFactor->setFocusPolicy(Qt::NoFocus);
143 m_psbZoomFactor, SIGNAL(valueChanged(
int)),
146 QWidgetAction* pFactor =
new QWidgetAction(pMenuZoom);
147 pFactor->setDefaultWidget(m_psbZoomFactor);
148 pMenuZoom->insertAction(m_pZoomOut, pFactor);
150 m_Menu.addSeparator();
151 m_pScreenShot =
new QAction(QIcon::fromTheme(
"camera-photo"),
152 tr(
"ScreenShot"), &m_Menu);
153 check = connect(m_pScreenShot, SIGNAL(triggered()),
154 this, SLOT(slotScreenShot()));
156 m_Menu.addAction(m_pScreenShot);
158 m_pRecord =
new QAction(
159 QIcon::fromTheme(
"media-record"), tr(
"Record"), &m_Menu);
160 m_pRecord->setCheckable(
true);
161 check = connect(m_pRecord, SIGNAL(toggled(
bool)),
162 this, SLOT(slotRecord(
bool)));
164 m_Menu.addAction(m_pRecord);
165 m_pRecordPause =
new QAction(
166 QIcon::fromTheme(
"media-playback-pause"), tr(
"Record pause"), &m_Menu);
167 m_pRecordPause->setCheckable(
true);
168 m_pRecordPause->setEnabled(
false);
169 check = connect(m_pRecordPause, SIGNAL(toggled(
bool)),
170 this, SIGNAL(sigRecordPause(
bool)));
172 m_Menu.addAction(m_pRecordPause);
175 m_Menu.addSeparator();
177 m_Menu.addAction(m_pSettings);
189 qDebug(log) << Q_FUNC_INFO;
193 qCritical(log) <<
"new CConnectThread fail";
204 qDebug(log) << Q_FUNC_INFO;
231 Q_ASSERT(m_pFrmViewer);
235 m_pFrmViewer->slotSetZoomFactor(
GetParameter()->GetZoomFactor());
237 m_psbZoomFactor->setValue(m_pFrmViewer->
GetZoomFactor() * 100);
241 m_pZoomToWindow->setChecked(
true);
243 if(m_pZoomAspectRatio)
244 m_pZoomAspectRatio->setChecked(
true);
247 m_pZoomOriginal->setChecked(
true);
250 m_pZoomIn->setChecked(
true);
262 GetParameter()->SetAdaptWindows(m_pFrmViewer->GetAdaptWindows());
270void CConnecterThread::slotRecord(
bool checked)
272 qDebug(log) << Q_FUNC_INFO << checked;
273 QAction* pRecord = qobject_cast<QAction*>(sender());
277 pRecord->setIcon(QIcon::fromTheme(
"media-playback-stop"));
278 pRecord->setText(tr(
"Stop record"));
281 pRecord->setIcon(QIcon::fromTheme(
"media-playback-start"));
282 pRecord->setText(tr(
"Start record"));
284 m_pRecordPause->setEnabled(checked);
285 emit sigRecord(checked);
289void CConnecterThread::slotRecorderStateChanged(
290 QMediaRecorder::RecorderState state)
292 if(QMediaRecorder::StoppedState == state)
295 m_pRecordPause->setChecked(
false);
302 if(!m_pScroll || !m_pFrmViewer)
return;
303 m_pFrmViewer->slotSetZoomFactor(((
double)v) / 100);
307void CConnecterThread::slotScreenShot()
312 QString szFile = record.GetImageFile(
true);
313 bool bRet = m_pFrmViewer->GrabImage().save(szFile);
315 qDebug(log) <<
"Success: save screenshot to" << szFile;
317 qCritical(log) <<
"Fail: save screenshot to" << szFile;
318 if(record.GetEndAction() != CParameterRecord::ENDACTION::No)
319 QDesktopServices::openUrl(QUrl::fromLocalFile(szFile));
此类仅用于 CConnecterThread 。 一个线程只处理一个连接
插件的连接者接口,此接口仅由插件使用。 所有的需要 CConnect 的插件连接者均需要从此接口派生。
virtual CParameterBase * GetParameter()
Get parameter
virtual QString ServerName()
当前连接名(远程桌面的名称,如果没有,则是 IP:端口)。例如:服务名或 IP:端口
默认启动一个后台线程。实现一个后台线程处理一个连接。 可与插件接口从 CPluginClient 派生的插件一起使用,用于连接是阻塞模型的。
virtual int Load(QSettings &set) override
加载参数
virtual QWidget * GetViewer() override
得到显示视图
virtual int Initial() override
Initial parameters and resource
void slotValueChanged(int v)
emit by zoom menu in the class
virtual int Clean() override
Clean parameters and resource
virtual int DisConnect() override
emit sigConnected() in CConnectThread::run()
virtual QString ServerName() override
当前连接名(远程桌面的名称,如果没有,则是 IP:端口)。例如:服务名或 IP:端口
virtual int Connect() override
启动一个后台线程,并建立 CConnect 实例。在 CConnect 中触发 sigConnected()
virtual int Save(QSettings &set) override
保存参数
virtual int Load(QSettings &set)
加载参数
virtual int Clean()
Clean parameters and resource
virtual int Save(QSettings &set)
保存参数
virtual int Initial()
Initial parameters and resource
用于显示从 CConnectDesktop 输出的图像,和向 CConnectDesktop 发送键盘、鼠标事件。
@ Original
原始桌面大小,桌面的左上点与窗口的左上点对齐
@ KeepAspectRationToWindow
保持长宽比缩放到窗口大小,窗口是固定的
@ ZoomToWindow
桌面缩放到窗口大小,窗口是固定的
double GetZoomFactor() const
调整缩放系数。 调整完成后需要调用 SetAdaptWindows(FrmViewer::Zoom) 缩放窗口大小。
客户端插件接口。用于建立 CConnecter 实例,它由协议插件实现。