Qt-Vnc远程

1.6k words

VNC简介

VNC(Virtual Network Computing)是基于RFB(Remote Frame Buffer)协议的远程系统,C/S端口默认为5900,B/S端口默认为5800。

RFB (远程帧缓存) 是一个远程图形用户的简单协议,工作在帧缓存级别上,其传输的是像素数据是以XY为起点的方框数据,通过矩形图形数据组进行帧缓存的更新。另外更新是由客户端通过命令驱动的,也就是说更新只是服务器在响应客户端的请求时发生的,如果网络较差时,有些帧的缓存会忽略,这样能减少客户端对网络和绘制速度的要求。

远程桌面协议对比:

SPICE VNC RDP
BIOS屏幕显示 不能
全彩支持
更改分辨率
多显示器 多显示器支持(高达4画面) 只有一个屏幕 多显示器支持
图像传输 图像和图形传输 图像传输 图像和图形传输
视频播放支持 GPU加速支持 不能 GPU加速支持
音频传输 双向语音可以控制 不能 双向语音可以控制
鼠标控制 客户端服务器都可以控制 服务器端控制 服务器端控制

VNC作为一种远程桌面协议,常常用在嵌入式开发中,在嵌入式设备上运行vnc服务程序,即可在PC端远程控制。

QT环境要求

  1. QT版本需要5.8以上,可以下载相应版本的源码包,比如5.9.6.zip,解压之后,在qtbase/src/plugins/platforms下可以看见有vnc的源码

image-20211118090352762

  1. 检查qt库安装目录下插件plugins文件夹中platforms目录是否有vnc动态库libqvnc.so
1
2
3
# ls /usr/lib/qt5.8/plugins/platforms/
libqeglfs.so libqminimal.so libqoffscreen.so
libqlinuxfb.so libqminimalegl.so libqvnc.so

注意:QT提供的VNC服务比较简单,只支持一些基本的功能,另外老版本的VNC中也有一些BUG可能会造成崩溃,所以最好还是尽量使用新版本。

使用教程

QT程序启动vnc服务

  1. 方式1:通过设置环境变量,改变程序的启动方式

    配置QT程序的启动的方式 export QT_QPA_PLATFORM=vnc

  2. 方式2:启动程序时指定启动方式

    启动参数./test -platform vnc:size=800x600:port=12345

    • size 分辨率
    • port 服务端口号(不加则默认为5900)
    • mmsize 物理尺寸

使用VNC客户端

市面上的VNC客户端有很多,常用的比如Realvnc,另外也有很多开源的项目:

常见问题

  1. VNC远程控件显示尺寸大小不一致

    物理尺寸不一致导致的,可以先查询本地显示下的物理尺寸,在设置VNC启动参数mmsize

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #分辨率
    qDebug("w:%d h:%d",
    QApplication::desktop()->screen()->width(),
    QApplication::desktop()->screen()->height());
    #DPI
    qDebug("log-dpi:%f phy-dpi:%f",
    app.primaryScreen()->logicalDotsPerInch(),
    app.primaryScreen()->physicalDotsPerInch());
    #物理尺寸
    qDebug("phy-w:%f phy-h:%f", app.primaryScreen()->physicalSize().width(), app.primaryScreen()->physicalSize().height());

参考

Comments