Qt使用udp的Broadcast实现广播图片
目錄
?
基礎(chǔ)以及演示
源碼如下
基礎(chǔ)以及演示
關(guān)于UDP的基礎(chǔ)博文
Qt文檔閱讀筆記-QUdpSocket基本表述及簡單實(shí)現(xiàn)
https://blog.csdn.net/qq78442761/article/details/85258574
?
Qt文檔閱讀筆記-Broadcast Sender Example與Broadcast Receiver Example解析
https://blog.csdn.net/qq78442761/article/details/85261408
?
如何發(fā)送圖片,關(guān)鍵代碼如下:
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()這個(gè)函數(shù),他有發(fā)送數(shù)據(jù)是有大小的,具體可以看文檔!
?
發(fā)送端運(yùn)行截圖如下:
加載圖片后的發(fā)送端!
?
點(diǎn)擊發(fā)送后,windows的接收端運(yùn)行截圖如下:
點(diǎn)擊發(fā)送后,Linux的接收端運(yùn)行截圖如下:
這里因?yàn)長inux虛擬機(jī)開不了3D圖像加速,所以界面效果不太好!
?
源碼如下
程序源碼如下:
發(fā)送端結(jié)構(gòu)
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_Hmain.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";} }?
接收端代碼如下:
程序結(jié)構(gòu)如下:
源碼如下:
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_Hmain.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()); }?
總結(jié)
以上是生活随笔為你收集整理的Qt使用udp的Broadcast实现广播图片的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux学习笔记-匿名和命名管道读写的
- 下一篇: Qt工作笔记-仿大佬风格代码(使用#if