【QT】qt实现多人屏幕共享系统

更新时间:2023-07-30 14:50:40 阅读: 评论:0

【QT】qt实现多⼈屏幕共享系统交流群号:245022761(IT项⽬交流群)
⽬录
开发环境
开发语⾔:C++
开发⼯具:  Qt Creator
交叉编译环境:Unbuntu 16.04  ()
运⾏环境
服务端:Windows平台
客户端:ARM平台(gec6818  )
系统功能
1、window桌⾯实时在开发板上显⽰
2、开发板远程控制桌⾯⿏标点击(双击、单机、⿏标移动等)
3、开发板⽂件分享到window桌⾯上
4、多⼈聊天
运⾏效果
服务端(电脑)
上⽅区域:左边⼿形按钮启动服务开始投屏,STOP按钮结束投屏(QPushButton)
中间区域:显⽰所有聊天信息(IP+内容)(QTextBrowr)
下⽅区域:显⽰⽂件接收的进度(QProgressBar)
西安博物院客户端(开发板)
左上区域:投屏显⽰区域(QScrollArea + QLabel)
左下区域:编辑发送内容(QLineEdit)
右上区域:显⽰发送的内容(QTextBrowr)
右下区域:发送按钮、⽂件选择传输按钮(QPushButton)
实现思路
本系统采⽤TCP、UDP协议进⾏数据传输,TCP负责⼤⽂件传输(PPT、视频),UDP负责⽂字、图⽚传输
发送端(共享屏幕服务端) :获取桌⾯图像 -》图像压缩-》编码成PNG-》把图⽚序列化为byte-》UDP⼴播发出
接收端:监听端⼝数据-》接收数据到内存数据⾥-》完成接收,QPixmap从内存数组⾥加载图像
TCP传输⽂件参考:
UDP通信参考:
如何提⾼图⽚传输速率?
1、压缩图⽚⼤⼩,使⽤QT⾃带的压缩函数scaled()
该函数有2中缩放⽅式,各有优缺,”快速缩放”得到的图⽚质量不佳,”平滑缩放”质量很好但速度⽋佳
使⽤技巧是调⽤scaled()将图⽚缩放⾄中等图⽚img.scaled(800, 480, Qt::KeepAspectRatio, Qt::FastTr
ansformation)进⾏快速压缩
然后在进⾏⼆次缩放scaled(400, 240, Qt::KeepAspectRatio, Qt::SmoothTransformation)进⾏平滑缩放,这样既保障图⽚的质量,⼜提⾼了压缩速度。
2、减少图⽚传输次数,服务端判断每帧图⽚是否发送变化,如果发⽣变化则传输,如果没有变化则不传输
3、关键代码
void MainScreen::SendPicture()
{
QDesktopWidget* desktop=QApplication::desktop();
QPixmap screen=QPixmap::grabWindow(desktop->winId());//截取桌⾯
//快速缩放(FastTransformation)、平滑缩放(SmoothTransformation)
//1920x1080
screen = 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;
//图⽚变化时则发送,否则不发送
Image()!=Image())
{
qDebug("图⽚发⽣变化");
泰坦尼克号沉船之谜oldpixmap = newpixmap;
QImage image;
Image();
QByteArray ba;
buffer(&ba);
buffer.open(QIODevice::ReadWrite);
葡萄糖image.save(&buffer,"PNG");
qint64 res;
QHostAddress address;
address.tAddress(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;
}
}
el
{
qDebug("图⽚⽆变化");
}
头发黄新的一年新的开始}
如何实现远程控制桌⾯⿏标?
1、(监听事件)客户端给显⽰区域添加事件过滤器,监听⿏标(或者触摸)事件
MouButtonPress = 2,    // ⿏标按下
苹果重装系统
MouButtonRelea = 3,  // ⿏标释放
MouButtonDblClick = 4, // ⿏标双击
MouMove = 5,          // ⿏标移动
Enter = 10,              // ⿏标进⼊显⽰区域
Leave = 11,              // ⿏标离开显⽰区域
Wheel = 31,              // ⿏标滚动
bool OtherScreen::eventFilter(QObject *obj, QEvent *event)
{
//监听触摸屏的单击事件
if(obj==label)
{
if(event->type()==QEvent::MouButtonPress)
{
{
clicktype = "MouButtonPress";
qDebug()<<"⿏标按下";
QMouEvent* qEvent=(QMouEvent*)event;
ndMessage(qEvent->pos());//将点击坐标点发送⾄服务端            return true;
}
el if(event->type()==QEvent::MouButtonRelea)
{
clicktype = "MouButtonRelea";
qDebug()<<"⿏标释放";
QMouEvent* qEvent=(QMouEvent*)event;
ndMessage(qEvent->pos());//将点击坐标点发送⾄服务端            return true;
}
el if(event->type()==QEvent::MouButtonDblClick)
{
clicktype = "MouButtonDblClick";
qDebug()<<"⿏标双击";
QMouEvent* qEvent=(QMouEvent*)event;
ndMessage(qEvent->pos());//将点击坐标点发送⾄服务端            return true;
}
el if(event->type()==QEvent::Enter)
{
动物为什么要冬眠clicktype = "Enter";
qDebug()<<"⿏标进⼊";
QMouEvent* qEvent=(QMouEvent*)event;
ndMessage(qEvent->pos());//将点击坐标点发送⾄服务端            return true;
}
el if(event->type()==QEvent::Leave)
{
clicktype = "Leave";
qDebug()<<"⿏标离开";
QMouEvent* qEvent=(QMouEvent*)event;
ndMessage(qEvent->pos());//将点击坐标点发送⾄服务端            return true;
}
el if(event->type()==QEvent::MouMove)
{
clicktype = "MouMove";
qDebug()<<"⿏标移动";
QMouEvent* qEvent=(QMouEvent*)event;
ndMessage(qEvent->pos());//将点击坐标点发送⾄服务端            return true;
}
el if(event->type()==QEvent::Wheel)
{
clicktype = "MouMove";
qDebug()<<"⿏标滚动";
QMouEvent* qEvent=(QMouEvent*)event;
ndMessage(qEvent->pos());//将点击坐标点发送⾄服务端            return true;
}
el if(event->type()==QEvent::HoverEnter)
{
clicktype = "MouMove";
qDebug()<<"⿏标光标进⼊⼀个悬停⼩部件";
QMouEvent* qEvent=(QMouEvent*)event;
ndMessage(qEvent->pos());//将点击坐标点发送⾄服务端            return true;
}
el
{
clicktype = " ";
clicktype = " ";
初三数学课程
return fal;
}
}
el
{
return OtherScreen::eventFilter(obj,event);
}
}
2、(模拟⿏标)服务端接收客户端发来的触发事件类型,调⽤windows⿏标触发事件,从⽽到达点击、双击、移动
引⼊头⽂件 #include <windows.h>
Windows⿏标按键事件
⿏标移动事件

本文发布于:2023-07-30 14:50:40,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1123828.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:发送   服务端   事件   坐标
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图