交流群号:245022761(IT项目交流群)

目录

开发环境

运行环境

系统功能

运行效果

服务端(电脑)

客户端(开发板)

实现思路

如何提高图片传输速率?

如何实现远程控制桌面鼠标?

坐标转换

获取本地IP


开发环境

开发语言:C++

开发工具:  Qt Creator

交叉编译环境:Unbuntu 16.04   (【QT】ubuntu交叉编译Qt程序_俊俊的博客-CSDN博客_交叉编译qt程序)

运行环境

服务端:Windows平台

客户端:ARM平台(gec6818   首页)

系统功能

1、window桌面实时在开发板上显示

2、开发板远程控制桌面鼠标点击(双击、单机、鼠标移动等)

3、开发板文件分享到window桌面上

4、多人聊天

运行效果

服务端(电脑)

上方区域:左边手形按钮启动服务开始投屏,STOP按钮结束投屏(QPushButton)

中间区域:显示所有聊天信息(IP+内容)(QTextBrowser)

下方区域:显示文件接收的进度(QProgressBar)

客户端(开发板)

左上区域:投屏显示区域(QScrollArea + QLabel)

左下区域:编辑发送内容(QLineEdit)

右上区域:显示发送的内容(QTextBrowser)

右下区域:发送按钮、文件选择传输按钮(QPushButton)

实现思路

本系统采用TCP、UDP协议进行数据传输,TCP负责大文件传输(PPT、视频),UDP负责文字、图片传输

发送端(共享屏幕服务端) :获取桌面图像 -》图像压缩-》编码成PNG-》把图片序列化为byte-》UDP广播发出

接收端:监听端口数据-》接收数据到内存数据里-》完成接收,QPixmap从内存数组里加载图像

TCP传输文件参考:【QT】基于TCP的文件传输系统_俊俊的博客-CSDN博客_qt tcp文件传输

UDP通信参考:【QT】QT中UDP通信的实现(单播、组播和广播)_俊俊的博客-CSDN博客_qt实现udp数据发送与接收

如何提高图片传输速率?

1、压缩图片大小,使用QT自带的压缩函数scaled()

该函数有2中缩放方式,各有优缺,”快速缩放”得到的图片质量不佳,”平滑缩放”质量很好但速度欠佳

使用技巧是调用scaled()将图片缩放至中等图片img.scaled(800, 480, Qt::KeepAspectRatio, Qt::FastTransformation)进行快速压缩

然后在进行二次缩放scaled(400, 240, Qt::KeepAspectRatio, Qt::SmoothTransformation)进行平滑缩放,这样既保障图片的质量,又提高了压缩速度。

2、减少图片传输次数,服务端判断每帧图片是否发送变化,如果发生变化则传输,如果没有变化则不传输

3、关键代码

void MainScreen::SendPicture()
{QDesktopWidget* desktop=QApplication::desktop();QPixmap screen=QPixmap::grabWindow(desktop->winId());//截取桌面//快速缩放(FastTransformation)、平滑缩放(SmoothTransformation)//1920x1080screen = screen.scaled(800, 480, Qt::KeepAspectRatio, Qt::FastTransformation).scaled(400, 240, Qt::KeepAspectRatio, Qt::SmoothTransformation);//screen=screen.scaled(320,240,Qt::IgnoreAspectRatio,Qt::SmoothTransformation);newpixmap = screen;//图片变化时则发送,否则不发送if(oldpixmap.toImage()!=newpixmap.toImage()){qDebug("图片发生变化");oldpixmap = newpixmap;QImage image;image=newpixmap.toImage();QByteArray ba;        buffer(&ba);buffer.open(QIODevice::ReadWrite);image.save(&buffer,"PNG");qint64 res;QHostAddress address;address.setAddress(ipAddress);//QHostAddress("192.168.12.208")\QHostAddress::Broadcast//广播if((res=this->_Socket->writeDatagram(ba,ba.length(),QHostAddress("192.168.12.208"),ports))!=ba.length()){//qDebug()<<res<<ba.length();return;}}else{qDebug("图片无变化");}
}

如何实现远程控制桌面鼠标?

1、(监听事件)客户端给显示区域添加事件过滤器,监听鼠标(或者触摸)事件

MouseButtonPress = 2,    // 鼠标按下

MouseButtonRelease = 3,  // 鼠标释放

MouseButtonDblClick = 4, // 鼠标双击

MouseMove = 5,           // 鼠标移动

Enter = 10,              // 鼠标进入显示区域

Leave = 11,              // 鼠标离开显示区域

Wheel = 31,              // 鼠标滚动

bool OtherScreen::eventFilter(QObject *obj, QEvent *event)
{//监听触摸屏的单击事件if(obj==label){if(event->type()==QEvent::MouseButtonPress){      clicktype = "MouseButtonPress";qDebug()<<"鼠标按下";QMouseEvent* qEvent=(QMouseEvent*)event;sendMessage(qEvent->pos());//将点击坐标点发送至服务端return true;}else if(event->type()==QEvent::MouseButtonRelease){clicktype = "MouseButtonRelease";qDebug()<<"鼠标释放";QMouseEvent* qEvent=(QMouseEvent*)event;sendMessage(qEvent->pos());//将点击坐标点发送至服务端return true;}else if(event->type()==QEvent::MouseButtonDblClick){clicktype = "MouseButtonDblClick";qDebug()<<"鼠标双击";QMouseEvent* qEvent=(QMouseEvent*)event;sendMessage(qEvent->pos());//将点击坐标点发送至服务端return true;}else if(event->type()==QEvent::Enter){clicktype = "Enter";qDebug()<<"鼠标进入";QMouseEvent* qEvent=(QMouseEvent*)event;sendMessage(qEvent->pos());//将点击坐标点发送至服务端return true;}else if(event->type()==QEvent::Leave){clicktype = "Leave";qDebug()<<"鼠标离开";QMouseEvent* qEvent=(QMouseEvent*)event;sendMessage(qEvent->pos());//将点击坐标点发送至服务端return true;}else if(event->type()==QEvent::MouseMove){clicktype = "MouseMove";qDebug()<<"鼠标移动";QMouseEvent* qEvent=(QMouseEvent*)event;sendMessage(qEvent->pos());//将点击坐标点发送至服务端return true;}else if(event->type()==QEvent::Wheel){clicktype = "MouseMove";qDebug()<<"鼠标滚动";QMouseEvent* qEvent=(QMouseEvent*)event;sendMessage(qEvent->pos());//将点击坐标点发送至服务端return true;}else if(event->type()==QEvent::HoverEnter){clicktype = "MouseMove";qDebug()<<"鼠标光标进入一个悬停小部件";QMouseEvent* qEvent=(QMouseEvent*)event;sendMessage(qEvent->pos());//将点击坐标点发送至服务端return true;}else{clicktype = " ";return false;}}else{return OtherScreen::eventFilter(obj,event);}
}

2、(模拟鼠标)服务端接收客户端发来的触发事件类型,调用windows鼠标触发事件,从而到达点击、双击、移动

引入头文件 #include <windows.h>

Windows鼠标按键事件

鼠标移动事件

//模拟鼠标点击事件
void MainScreen::simulate_mouse(QString type, QPoint point)
{//鼠标按下if(type == "MouseButtonPress"){qDebug()<<"鼠标按下"<<point;::mouse_event(MOUSEEVENTF_LEFTDOWN|MOUSEEVENTF_LEFTUP,point.x(),point.y(),0,0);}//鼠标进去和离开else if(type == "Enter"){//SetCursorPos(point.x(),point.y());//设置鼠标位置,跟随开发板的触摸位置qDebug()<<"鼠标进入"<<point;}//鼠标移动else if(type == "MouseMove"){SetCursorPos(point.x(),point.y());::mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);::mouse_event(MOUSEEVENTF_MOVE,0,0,0,0);qDebug()<<"鼠标移动"<<point;}else{SetCursorPos(point.x(),point.y());//设置鼠标位置,跟随开发板的触摸位置}
}

坐标转换

根据开发板和电脑的屏幕尺寸大小按比例换算,代码如下

//计算获得PC端的点击坐标
QPoint MainScreen::clickPoint(QPoint point, QRect size)
{QRect rect;QPoint click;rect=QApplication::desktop()->screenGeometry();qDebug()<<rect;click.setX(rect.width()*((float)point.x()/(float)size.width()));click.setY(rect.height()*((float)point.y()/(float)size.height()));//qDebug()<<"转换:"<<click;ui->textBrowser->append("<font color=gray>坐标:x->"+ QString::number(click.x())+ "  y->"+ QString::number(click.y())+ "\r\n</font>");return click;
}

获取本地IP

/**获取本机Ip地址*/
void MainScreen::getIp()
{QList<QHostAddress> ipAddressesList = QNetworkInterface::allAddresses();// use the first non-localhost IPv4 addressfor (int i = 0; i < ipAddressesList.size(); ++i) {if (ipAddressesList.at(i) != QHostAddress::LocalHost &&ipAddressesList.at(i).toIPv4Address()) {ipAddress = ipAddressesList.at(i).toString();break;}}// if we did not find one, use IPv4 localhostif (ipAddress.isEmpty())ipAddress = QHostAddress(QHostAddress::LocalHost).toString();qDebug()<<"IP为:"<<ipAddress;
}

【QT】qt实现多人屏幕共享系统相关推荐

  1. OpenCV+ Qt Designer 开发人脸识别考勤系统

    文章目录 1. 系统介绍 2. 系统架构 3. 开发步骤 3.1 安装必要的库 3.2 设计用户界面 3.3 编写代码 3.3.1 导入库 3.3.2 连接数据库 3.3.3 定义主窗口类 3.3.4 ...

  2. Qt入门--在windows7-64系统上安装Qt

    第一次接触Qt,安装了好几个版本,浪费了不少时间,编译手机APP时不通过,看到有网友说是系统兼容性问题,Qt只有32位版,都准备把系统换成32位的win7了,又重新装了一遍,呵呵,所以然成了!!! 重 ...

  3. 基于qt和mysql点菜系统的优点_基于QT的电子点餐订餐系统的设计与实现(SQLite)

    基于QT的电子点餐订餐系统的设计与实现(SQLite)(任务书,外文翻译,毕业论文20000字,程序代码,SQLite数据库,答辩PPT) 摘  要 在深入研究中小餐饮企业工作流程的基础上,分析制约餐 ...

  4. Qt Qt/E Qtopia 的关系

    Qt的授权是分为两条线,商业版和开源版.如果使用商业版的Qt,那么开发出的程序可以是私有的和商业的:如果使用的是开源版的Qt,由于其使用的是GPL协议,那么可发出的程序也必须是GPL的.不过自从qt ...

  5. Qt, QT/E, Qtopia 的区别

    转自Qt, QT/E, Qtopia 的区别 Qt泛指Qt的所有桌面版本,比如Qt/X11,Qt Windows,Qt Mac等.由于Qt最早是在Linux中随着KDE流行开来的,因此通常很多人说的Q ...

  6. Qt | Qt For Android、Qt5.14.2安卓开发环境搭建详细步骤

    Qt | Qt For Android.Qt5.14.2安卓开发环境搭建详细步骤 目录 Qt | Qt For Android.Qt5.14.2安卓开发环境搭建详细步骤 1.简介 2.软件下载 1.J ...

  7. 重装系统找不到固态_90%的人重装系统后,感觉电脑变快了

    大家好,今天分享一篇来源小白一键重装网(xiaobaixitong.com)关于解答:90%的人重装系统后,感觉电脑变快了 每日壁纸 · 长按保存 其实大家可能对重装系统一直有一个疑问,重装系统会对电 ...

  8. windows7 php 无法启动,window_Win7系统无法启动错误提示代码为File:\BOOT\BCD,  很多人Win7系统用户都有遇 - phpStudy...

    Win7系统无法启动错误提示代码为File:\BOOT\BCD 很多人Win7系统用户都有遇到过电脑无法开机出现错误提示的问题,提示File:\BOOT\BCD status:0xc000000f 的 ...

  9. 端到端说话人验证系统中长度归一化的分析

    Analysis of Length Normalization in End-to-End Speaker Verification System 端到端说话人验证系统中长度归一化的分析 摘要 经典 ...

最新文章

  1. oracle函数,oracle编写函数
  2. ios 消除 字符串 首尾空格
  3. 2021暑假每日一题 【week8 完结】
  4. 家用笔记本电脑什么牌子好_南阳家用小型电梯什么牌子好
  5. 学习Promise之前你必须理解的知识点:异步处理的通用模型
  6. JS设计模式七:发布-订阅模式
  7. c语言程序设计网络作业,北语网院17春《C语言程序设计》作业_2满分答案
  8. (转载)tomcat5下jsp出现getOutputStream() has already been called for this
  9. 使用git建立本地仓储管理代码【转】
  10. 忘了微信密码怎么办_微信支付密码怎么改?微信支付密码忘了怎么办?详细教程来了!...
  11. fedora15下GNOME3使用笔记
  12. java在Intellij上使用sigar
  13. NLP︱词向量经验总结(功能作用、高维可视化、R语言实现、大规模语料、延伸拓展)
  14. Computer Science Theory for the Information Age-2: 高维空间中的正方体和Chernoff Bounds
  15. acwing 合唱队形
  16. JIRA + FishEye + Crucible + Confluence + PostgreSQL
  17. php webshell探索-常见小马
  18. 思科交换机指示灯全解
  19. CCF系列题解--2015年12月第三题 ASCII字符画
  20. jpeg图像质量参数及icc信息提取

热门文章

  1. iOS 播放系统声音系统声音大全
  2. Three开发笔记(二)
  3. 软件加密保护中加密狗软加密跟硬加密的安全强度
  4. 使用zxing生成二维码
  5. 惊呆了!瞬间扩容10T空间,直接将阿里云盘变本地硬盘!还能这样玩阿里云盘?
  6. 易语言通达信交易api接口是什么?
  7. 【224期】Java 字符串拼接五种方法的性能比较分析,从执行100次到90万次?
  8. 每天学习一个设计模式(七):结构型之代理模式
  9. 设计模式——UML类图
  10. 关于银杏树的生长过程的资料