基于Libvncserver开发Qt程序(三)

前期准备工作见:基于Libvncserver开发环境搭建

上一期见:基于Libvncserver开发Qt程序(一)-CSDN博客基于Libvncserver开发Qt程序(二)-CSDN博客

这一期继续实现VncViewer类,涵盖鼠标、键盘事件处理及全屏切换功能的实现原理。代码基于 Qt 框架开发,结合 VNC 协议(rfb 库)实现远程桌面的实时交互。

1.鼠标事件处理

1.1 鼠标移动

void VncViewer::mouseMoveEvent(QMouseEvent *event)
{
    if (m_startFlag || m_isMouseClicked)
    {
        int widgetWidth = width();
        int widgetHeight = height();
        if (widgetWidth == 0 || widgetHeight == 0) return;

        int x = event->localPos().x() / width() * cl->width;
        int y = event->localPos().y() / height() * cl->height;
        int buttons = (event->buttons() & Qt::LeftButton) ? 1 : 0;

        SendPointerEvent(cl, x, y, buttons);
        SendFramebufferUpdateRequest(cl, false, 0, 0, cl->width, cl->height);
    }
}

远程坐标 = 本地坐标 × (远程分辨率 / 本地窗口尺寸)

实时更新画面:通过 SendFramebufferUpdateRequest 主动请求服务器刷新画面,确保鼠标移动可见。

1.2 鼠标点击事件

void VncViewer::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton) {
        m_isMouseClicked = true;
    }

    if (m_startFlag) {
        int buttonMask = 0;
        if (event->button() == Qt::LeftButton) buttonMask = 1;
        else if (event->button() == Qt::MiddleButton) buttonMask = 2;
        else if (event->button() == Qt::RightButton) buttonMask = 4;

        SendPointerEvent(cl, event->localPos().x() * cl->width / width(), 
                         event->localPo
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值