QtScrcpy源码解析(3)

388 阅读1分钟

前沿

之前开发了一个云真机软件,参考的是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);
    // 省略
}