利用QT實現(xiàn)UDP聊天小程序
利用QT的UDP技術(shù),實現(xiàn)兩個QT程序之間的聊天程序。
示例代碼
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QUdpSocket> #include <QPushButton> #include <QLineEdit> #include <QTextBrowser> #include <QLabel> #include <QCloseEvent> class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = 0); ~Widget(); private: QUdpSocket *udpsock; QPushButton *btn1,*btn2,*btn3; QLineEdit *edit1,*edit2,*edit3; QLabel *label1,*label2,*label3; QTextBrowser *text1; void closeEvent(QCloseEvent *event); private slots: void mybindip(); void mysenddata(); void recvmydata(); }; #endif // WIDGET_H
#include "widget.h" #include <QHBoxLayout> #include <QVBoxLayout> #include <QHostAddress> #include <QMessageBox> Widget::Widget(QWidget *parent) : QWidget(parent) { this->setWindowTitle("聊天室"); udpsock=new QUdpSocket(this); //udpsock->bind(8080); connect(udpsock,SIGNAL(readyRead()),this,SLOT(recvmydata())); label1=new QLabel(tr("發(fā)送端口號:")); edit1=new QLineEdit(); label2=new QLabel(tr("接收端口號:")); edit2=new QLineEdit(); btn1=new QPushButton(tr("綁定")); connect(btn1,SIGNAL(clicked()),this,SLOT(mybindip())); btn2=new QPushButton(tr("發(fā)送")); connect(btn2,SIGNAL(clicked()),this,SLOT(mysenddata())); label3=new QLabel(tr("消息內(nèi)容:")); edit3=new QLineEdit(); text1=new QTextBrowser(); QHBoxLayout *lay1=new QHBoxLayout(); lay1->addWidget(label1); lay1->addWidget(edit1); lay1->addWidget(label2); lay1->addWidget(edit2); lay1->addWidget(btn1); QHBoxLayout *lay2=new QHBoxLayout(); lay2->addWidget(label3); lay2->addWidget(edit3); lay2->addWidget(btn2); QVBoxLayout *lay3=new QVBoxLayout(this); lay3->addLayout(lay1); lay3->addLayout(lay2); lay3->addWidget(text1); } //綁定接收端口號 void Widget::mybindip() { udpsock->close(); //獲取接收端口號 QString port1=edit2->text(); if(port1.isEmpty()) { QMessageBox::critical(this,"錯誤信息","發(fā)送端口號不可以為空!"); return ; } udpsock->bind(port1.toInt()); QMessageBox::information(this,"提示信息","綁定成功!端口號是"+port1); } //發(fā)送消息 void Widget::mysenddata() { //獲取發(fā)送端口號 QString port2=edit1->text(); if(port2.isEmpty()) { QMessageBox::critical(this,"錯誤信息","發(fā)送端口號不可以為空!"); return ; } //獲取發(fā)送內(nèi)容 QString txt=edit3->text(); char buf[1024]={0}; strcpy(buf,txt.toStdString().data()); //定義地址類 QHostAddress *serip=new QHostAddress(); serip->setAddress("127.0.0.1"); udpsock->writeDatagram(buf,strlen(buf),*serip,port2.toInt()); delete serip; edit3->clear(); edit3->setFocus(); } //接收消息 void Widget::recvmydata() { QMessageBox::information(this,"提示信息","接收到消息"); char buf[1024]={0}; while(udpsock->hasPendingDatagrams()) { udpsock->readDatagram(buf,sizeof(buf)); text1->append(buf); memset(buf,0,sizeof(buf)); } } //關(guān)閉 void Widget::closeEvent(QCloseEvent *event) { if(QMessageBox::information(this,"提示信息","確定要退出該程序?",QMessageBox::Yes|QMessageBox::No,QMessageBox::No)==QMessageBox::Yes) { event->accept(); }else { event->ignore(); } } Widget::~Widget() { }
效果圖
到此這篇關(guān)于利用QT實現(xiàn)UDP聊天小程序的文章就介紹到這了,更多相關(guān)QT UDP聊天程序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實現(xiàn)LeetCode(228.總結(jié)區(qū)間)
這篇文章主要介紹了C++實現(xiàn)LeetCode(228.總結(jié)區(qū)間),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07C++ OpenCV學(xué)習(xí)之圖像金字塔與圖像融合詳解
圖像金字塔分為兩種:高斯金字塔和拉普拉斯金字塔。圖像金字塔在保持細節(jié)的條件下進行圖像融合等多尺度編輯操作非常有用。本文將利用圖像金字塔實現(xiàn)圖像融合,需要的可以參考一下2022-03-03C語言中結(jié)構(gòu)體(struct)的幾種初始化方法
相信大家都知道struct結(jié)構(gòu)體是C語言中非常重要的復(fù)合類型,初始化的方法很多,那么小編下面對這些方法進行總結(jié),便于自己和大家以后查閱,有需要的可以參考借鑒。2016-08-08有關(guān)C++繼承與友元、繼承與類型轉(zhuǎn)換詳解
下面小編就為大家?guī)硪黄嘘P(guān)C++繼承與友元、繼承與類型轉(zhuǎn)換詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01淺談C++函數(shù)聲明后面加throw()的作用(必看)
下面小編就為大家?guī)硪黄獪\談C++函數(shù)聲明后面加throw()的作用(必看)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01學(xué)好C++必須做到的50條 絕對經(jīng)典!
學(xué)好C++必須做到的50條,絕對經(jīng)典!想要學(xué)好C++的朋友一定要認真閱讀本文,更要做到以下50條2016-09-09