日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt使用udp的Broadcast实现广播图片

發布時間:2025/3/15 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt使用udp的Broadcast实现广播图片 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

?

基礎以及演示

源碼如下


基礎以及演示

關于UDP的基礎博文

Qt文檔閱讀筆記-QUdpSocket基本表述及簡單實現

https://blog.csdn.net/qq78442761/article/details/85258574

?

Qt文檔閱讀筆記-Broadcast Sender Example與Broadcast Receiver Example解析

https://blog.csdn.net/qq78442761/article/details/85261408

?

如何發送圖片,關鍵代碼如下:

void Widget::sendBtnClicked() {if(m_fileName.isEmpty())return;QFile file(m_fileName);if(!file.open(QIODevice::ReadOnly)){qDebug() << "open failed";return;}QByteArray byteArray;byteArray = file.readAll();if(-1 == m_udpSocket->writeDatagram(byteArray.data(), byteArray.size(), QHostAddress::Broadcast, 65530)){qDebug() << "send failed" << m_udpSocket->errorString();}else{qDebug() << "send successful";} }

這里要注意writeDatagram()這個函數,他有發送數據是有大小的,具體可以看文檔!

?

發送端運行截圖如下:

加載圖片后的發送端!

?

點擊發送后,windows的接收端運行截圖如下:

點擊發送后,Linux的接收端運行截圖如下:

這里因為Linux虛擬機開不了3D圖像加速,所以界面效果不太好!

?

源碼如下

程序源碼如下:

發送端結構

widget.h

#ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE class QUdpSocket; class QImage; QT_END_NAMESPACEnamespace Ui { class Widget; }class Widget : public QWidget {Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();protected slots:void loadPicBtnClicked();void sendBtnClicked();private:Ui::Widget *ui;QUdpSocket *m_udpSocket;QImage *m_image;QString m_fileName; };#endif // WIDGET_H

main.cpp

#include "widget.h" #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); }

widget.cpp

#include "widget.h" #include "ui_widget.h"#include <QDebug> #include <QPixmap> #include <QFile> #include <QUdpSocket> #include <QImage> #include <QFileDialog> #include <QDataStream>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this);m_udpSocket = new QUdpSocket(this);m_image = new QImage;connect(ui->loadPushButton, SIGNAL(clicked(bool)), this, SLOT(loadPicBtnClicked()));connect(ui->sendPushButton, SIGNAL(clicked(bool)), this, SLOT(sendBtnClicked())); }Widget::~Widget() {delete ui;delete m_image; }void Widget::loadPicBtnClicked() {QString fileName = QFileDialog::getOpenFileName(this, "選擇文件", "D:", "圖片文件(*png *JPG)");if(fileName.isEmpty())return;m_fileName = fileName;m_image->load(fileName);ui->label->setPixmap(QPixmap::fromImage(*m_image).scaled(256, 256)); }void Widget::sendBtnClicked() {if(m_fileName.isEmpty())return;QFile file(m_fileName);if(!file.open(QIODevice::ReadOnly)){qDebug() << "open failed";return;}QByteArray byteArray;byteArray = file.readAll();if(-1 == m_udpSocket->writeDatagram(byteArray.data(), byteArray.size(), QHostAddress::Broadcast, 65530)){qDebug() << "send failed" << m_udpSocket->errorString();}else{qDebug() << "send successful";} }

?

接收端代碼如下:

程序結構如下:

源碼如下:

widget.h

#ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE class QUdpSocket; class QTimer; QT_END_NAMESPACEnamespace Ui { class Widget; }class Widget : public QWidget {Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();private slots:void processPendingDatagrams();void timeout();private:Ui::Widget *ui;QUdpSocket *m_udpSocket;int m_screenWidth;int m_screenHeight;QTimer *m_timer;bool m_isRun; };#endif // WIDGET_H

main.cpp

#include "widget.h" #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); }

widget.cpp

#include "widget.h" #include "ui_widget.h" #include <QUdpSocket> #include <QPixmap> #include <QRect> #include <QTimer> #include <QDesktopWidget> #include <QDebug> #include <QByteArray> #include <QImage>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this);this->setWindowTitle("花架子");m_isRun = false;m_udpSocket = new QUdpSocket(this);m_udpSocket->bind(65530, QUdpSocket::ShareAddress);m_timer = new QTimer;setWindowFlags(Qt::Window|Qt::FramelessWindowHint);setAttribute(Qt::WA_TranslucentBackground);m_screenWidth = QApplication::desktop()->screenGeometry().width();m_screenHeight = QApplication::desktop()->screenGeometry().height();connect(m_udpSocket, SIGNAL(readyRead()), this, SLOT(processPendingDatagrams()));connect(m_timer, SIGNAL(timeout()), this, SLOT(timeout())); }Widget::~Widget() {delete ui;delete m_timer; }void Widget::processPendingDatagrams() {qDebug() << "processPendingDatagrams called";while(m_udpSocket->hasPendingDatagrams()){QByteArray datagram;datagram.resize(m_udpSocket->pendingDatagramSize());m_udpSocket->readDatagram(datagram.data(), datagram.size());QImage image;image.loadFromData(datagram);ui->label->setPixmap(QPixmap::fromImage(image));if(!m_isRun){m_timer->start(250);m_isRun = !m_isRun;}} }void Widget::timeout() {int numWidth = qrand()%m_screenWidth;int numHeight = qrand()%m_screenHeight;this->setGeometry(numWidth, numHeight, this->width(), this->height()); }

?

總結

以上是生活随笔為你收集整理的Qt使用udp的Broadcast实现广播图片的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。