前期准备工作见:基于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

&spm=1001.2101.3001.5002&articleId=148074818&d=1&t=3&u=627bc650723c4e9d92ca92520c093919)
1237

被折叠的 条评论
为什么被折叠?



