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));
61 qDebug(log) << Q_FUNC_INFO;
73int CConnecterThread::InitialMenu()
78 QMenu* pMenuZoom =
new QMenu(&m_Menu);
79 pMenuZoom->setTitle(tr(
"Zoom"));
80 pMenuZoom->setIcon(QIcon::fromTheme(
"zoom"));
81 m_pMenuZoom = m_Menu.addMenu(pMenuZoom);
82 m_pZoomToWindow = pMenuZoom->addAction(
83 QIcon::fromTheme(
"zoom-fit-best"), tr(
"Zoom to window"));
84 m_pZoomToWindow->setCheckable(
true);
85 check = connect(m_pZoomToWindow, &QAction::toggled,
this,
87 m_pScroll->slotSetAdaptWindows(
91 m_pZoomAspectRatio = pMenuZoom->addAction(
92 QIcon::fromTheme(
"zoom-aspect-ratio"),
93 tr(
"Keep aspect ration to windows"));
94 m_pZoomAspectRatio->setCheckable(
true);
95 check = connect(m_pZoomAspectRatio, &QAction::toggled,
this,
97 m_pScroll->slotSetAdaptWindows(
101 m_pZoomOriginal = pMenuZoom->addAction(
102 QIcon::fromTheme(
"zoom-original"), tr(
"Original"));
103 m_pZoomOriginal->setCheckable(
true);
104 check = connect(m_pZoomOriginal, &QAction::toggled,
this,
106 m_pScroll->slotSetAdaptWindows(
110 m_pZoomIn = pMenuZoom->addAction(QIcon::fromTheme(
"zoom-in"), tr(
"Zoom in"));
111 m_pZoomIn->setCheckable(
true);
113 m_pZoomIn, &QAction::toggled,
this,
116 m_psbZoomFactor->setValue((m_pFrmViewer->
GetZoomFactor() + 0.1) * 100);
119 m_pZoomOut = pMenuZoom->addAction(
120 QIcon::fromTheme(
"zoom-out"), tr(
"Zoom out"));
121 m_pZoomOut->setCheckable(
true);
123 m_pZoomOut, &QAction::toggled,
this,
126 m_psbZoomFactor->setValue((m_pFrmViewer->
GetZoomFactor() - 0.1) * 100);
129 QActionGroup* pGBViewZoom =
new QActionGroup(
this);
131 pGBViewZoom->addAction(m_pZoomToWindow);
132 pGBViewZoom->addAction(m_pZoomAspectRatio);
133 pGBViewZoom->addAction(m_pZoomOriginal);
134 pGBViewZoom->addAction(m_pZoomIn);
135 pGBViewZoom->addAction(m_pZoomOut);
137 m_psbZoomFactor =
new QSpinBox(pMenuZoom);
138 m_psbZoomFactor->setRange(0, 9999999);
139 m_psbZoomFactor->setValue(100);
140 m_psbZoomFactor->setSuffix(
"%");
141 m_psbZoomFactor->setEnabled(
false);
142 m_psbZoomFactor->setFocusPolicy(Qt::NoFocus);
144 m_psbZoomFactor, SIGNAL(valueChanged(
int)),
147 QWidgetAction* pFactor =
new QWidgetAction(pMenuZoom);
148 pFactor->setDefaultWidget(m_psbZoomFactor);
149 pMenuZoom->insertAction(m_pZoomOut, pFactor);
151 m_Menu.addSeparator();
152 m_pScreenShot =
new QAction(QIcon::fromTheme(
"camera-photo"),
153 tr(
"ScreenShot"), &m_Menu);
154 check = connect(m_pScreenShot, SIGNAL(triggered()),
155 this, SLOT(slotScreenShot()));
157 m_Menu.addAction(m_pScreenShot);
159 m_pRecord =
new QAction(
160 QIcon::fromTheme(
"media-record"), tr(
"Start record"), &m_Menu);
161 m_pRecord->setCheckable(
true);
162 check = connect(m_pRecord, SIGNAL(toggled(
bool)),
163 this, SLOT(slotRecord(
bool)));
165 m_Menu.addAction(m_pRecord);
166 m_pRecordPause =
new QAction(
167 QIcon::fromTheme(
"media-playback-pause"), tr(
"Record pause"), &m_Menu);
168 m_pRecordPause->setCheckable(
true);
169 m_pRecordPause->setEnabled(
false);
170 check = connect(m_pRecordPause, SIGNAL(toggled(
bool)),
171 this, SIGNAL(sigRecordPause(
bool)));
173 m_Menu.addAction(m_pRecordPause);
176 m_Menu.addSeparator();
178 m_Menu.addAction(m_pSettings);
190 qDebug(log) << Q_FUNC_INFO;
194 qCritical(log) <<
"new CConnectThread fail";
205 qDebug(log) << Q_FUNC_INFO;
232 Q_ASSERT(m_pFrmViewer);
236 m_pFrmViewer->slotSetZoomFactor(
GetParameter()->GetZoomFactor());
238 m_psbZoomFactor->setValue(m_pFrmViewer->
GetZoomFactor() * 100);
242 m_pZoomToWindow->setChecked(
true);
244 if(m_pZoomAspectRatio)
245 m_pZoomAspectRatio->setChecked(
true);
248 m_pZoomOriginal->setChecked(
true);
251 m_pZoomIn->setChecked(
true);
263 GetParameter()->SetAdaptWindows(m_pFrmViewer->GetAdaptWindows());
271void CConnecterThread::slotRecord(
bool checked)
273 qDebug(log) << Q_FUNC_INFO << checked;
274 QAction* pRecord = qobject_cast<QAction*>(sender());
279 pRecord->setText(tr(
"Stop record"));
282 pRecord->setText(tr(
"Start record"));
284 m_pRecordPause->setEnabled(checked);
285 emit sigRecord(checked);
289void CConnecterThread::slotRecorderStateChanged(
290 QMediaRecorder::RecorderState state)
292 qDebug(log) << Q_FUNC_INFO << state;
293 if(QMediaRecorder::StoppedState == state)
295 m_pRecord->setChecked(
false);
296 m_pRecordPause->setChecked(
false);
303 if(!m_pScroll || !m_pFrmViewer)
return;
304 m_pFrmViewer->slotSetZoomFactor(((
double)v) / 100);
308void CConnecterThread::slotScreenShot()
313 QString szFile = record.GetImageFile(
true);
314 bool bRet = m_pFrmViewer->GrabImage().save(szFile);
316 qDebug(log) <<
"Success: save screenshot to" << szFile;
318 qCritical(log) <<
"Fail: save screenshot to" << szFile;
319 if(record.GetEndAction() != CParameterRecord::ENDACTION::No)
320 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 Q_INVOKABLE int Clean()
Clean parameters and resource
virtual int Save(QSettings &set)
保存参数
virtual Q_INVOKABLE int Initial()
Initial parameters and resource
用于显示从 CConnectDesktop 输出的图像,和向 CConnectDesktop 发送键盘、鼠标事件。
@ Original
原始桌面大小,桌面的左上点与窗口的左上点对齐
@ KeepAspectRationToWindow
保持长宽比缩放到窗口大小,窗口是固定的
@ ZoomToWindow
桌面缩放到窗口大小,窗口是固定的
double GetZoomFactor() const
调整缩放系数。 调整完成后需要调用 SetAdaptWindows(FrmViewer::Zoom) 缩放窗口大小。
客户端插件接口。用于建立 CConnecter 实例,它由协议插件实现。