前沿
之前开发了一个云真机软件,参考的是QtScrcpy这个工程来开发。
开发的时间比较旧了,当时参考的这个工程还是一年多前了,现在回头再看看,源码解析一下这个工程,顺便也重新学习一下。
QtScrcpy地址
解析的版本是v2.1.2
QtScrcpy操作流处理
// videoform.cpp
// 鼠标操作
void VideoForm::mousePressEvent(QMouseEvent *event)
{
// 省略
if (m_videoWidget->geometry().contains(event->pos())) {
if (!device) {
return;
}
event->setLocalPos(m_videoWidget->mapFrom(this, event->localPos().toPoint()));
// 调用SDK中device的方法
emit device->mouseEvent(event, m_videoWidget->frameSize(), m_videoWidget->size());
}
// 省略
}
// 键盘操作
void VideoForm::keyPressEvent(QKeyEvent *event)
{
// 省略
emit device->keyEvent(event, m_videoWidget->frameSize(), m_videoWidget->size());
}
// device.cpp
void Device::mouseEvent(const QMouseEvent *from, const QSize &frameSize, const QSize &showSize)
{
if (!m_controller) {
return;
}
// 实际的数据转换是在inputconvertnormal.cpp中
// 对应的mouseEvent,keyEvent等等均是将客户端数据进行转换,然后发送到scrcpy服务中进行解析执行的
m_controller->mouseEvent(from, frameSize, showSize);
// 通知所有注册监听的地方
for (const auto& item : m_deviceObservers) {
item->mouseEvent(from, frameSize, showSize);
}
}
Device::Device(DeviceParams params, QObject *parent) : IDevice(parent), m_params(params)
{
// 省略
m_controller = new Controller([this](const QByteArray& buffer) -> qint64 {
if (!m_server || !m_server->getControlSocket()) {
return 0;
}
// 通过socket把数据传给scrcpy服务中进行解析
return m_server->getControlSocket()->write(buffer.data(), buffer.length());
}, params.gameScript, this);
// 省略
}