Qt应用程序开发8_第1页
Qt应用程序开发8_第2页
Qt应用程序开发8_第3页
Qt应用程序开发8_第4页
Qt应用程序开发8_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Qt应用程序开发Qt4程序设计根底QtDesigner应用QMainWindow、QDialog、LayoutQt4数据库应用Qt4多线程应用Qt4定时器Qt4事件处理Qt4网络编程QSS样式设计QGraphicsView应用自定义控件Qt4网络编程网络模块简介HTTP编程

FTP编程获取本机网络信息

UDP编程TCP编程1网络模块简介在Qt中提供了网络模块〔QtNetworkModule〕来用于网络程序的开发,在网络模块提供了多个相关类。用于FTP编程的QFtp类,用于HTTP编程的QNetworkAccessManager类和QNetworkReply类,用于获得本机信息的QHostInfo类,用于Tcp编程的QTcpServer类和QTcpSocket类,用于UDP编程的QUdpSocket类,用于网络加密的QSslSocket类,用于网络代理的QNetworkProxy类等等。包含头文件:#include<QtNetwork>在.pro文件中参加:QT+=network1网络模块简介2HTTP编程•HTTP即超文本传输协议,它是一种文件传输协议。Qt中使用QNetworkAccessManager类和QNetworkReply类来进行HTTP的编程。可以利用HTTP从网站上下载文件。QNetworkAccessManager类实现应用程序发送网络请求和接收回应的数据。实例化QNetworkAccessManager对象后,利用该对象发送网络请求,每次的请求后都会返回一个QNetworkReply对象.这个对象能够根据相应的请求来获得任何返回的数据。例如: QNetworkAccessManager*manager=newQNetworkAccessManager(this); connect(manager,SIGNAL(finished(QNetworkReply*)),this, SLOT(replyFinished(QNetworkReply*))); manager->")));QNetworkAccessManager有异步的API.如上例中当replyFinished()插槽被调用时,附带着QNetworkReply对象,同时包含着下载的数据等。2HTTP编程QNetworkAccessManager公有方法QNetworkReply

*QNetworkAccessManager::get(const

QNetworkRequest

&

request

)说明:发送一个请求来获得请求的内容,该方法返回一个QNetworkReply对象,并随时读取当有新数据到达时所发射的readyRead()信号。请求的内容及标题就会被下载。QNetworkAccessManager信号voidQNetworkAccessManager::finished(

QNetworkReply

*

reply

)说明:只要发送请求成功,它就会下载数据,而当数据下载完成后,该信号就会被发射。注意:在request完成后,在适当的时候要删除QNetworkReply对象,但是不要在与finished()信号相连接的插槽删除该对象,可以利用deleteLater()方法来删除。2HTTP编程注意:QNetworkAccessManager把接收到的所有request都放到一个队列中.并行被执行的request数目依赖于协议。目前HTTP协议在桌面平台针对一个主机端口支持同时执行6个request。例子:QNetworkRequestrequest;request.setUrl(QUrl(":"));request.setRawHeader("User-Agent","MyOwnBrowser1.0");QNetworkReply*reply=manager->get(request);connect(reply,SIGNAL(readyRead()),this,SLOT(slotReadyRead()));connect(reply,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(slotError(QNetworkReply::NetworkError)));connect(reply,SIGNAL(sslErrors(QList<QSslError>)),this,SLOT(slotSslErrors(QList<QSslError>)));2HTTP编程QNetworkReply类信号voidQIODevice::readyRead()

[signal]QNetworkReply类是由QIODevice类派生过来的。readyRead()信号是QIODevice类所有的,每次从设备读取的新数据到达时,该信号就会被发射。当有新数据追加到设备时,该信号会再次发射。而当还有数据在缓冲区等待读取的时候,该信号就不会被发射。voidQNetworkReply::error(

QNetworkReply::NetworkError

code

)

[signal]当reply探测到在处理过程中有错误的时候,该信号就会被发射。同时finished()信号也会跟随被发射,说明该请求连接结束。code参数指定错误的代码,可以通过errorString()方法来获取具体的错误信息。voidQNetworkReply::sslErrors(const

QList<QSslError>&

errors

)

[signal]在SSL/TLSsession建立时如果遇到错误,该信号就会被发射,如当证书验证错误等。Errors参数包含了错误的列表。2HTTP编程QNetworkReply类信号voidQNetworkReply::downloadProgress(

qint64

bytesReceived,

qint64

bytesTotal

)

[signal]该信号被发射来说明网络请求数据下载的进度。QNetworkReply类公有成员QByteArray

QIODevice::readAll()这是个重载的方法,从设备中读取所有的下载数据。返回类型为QByteArray.当QByteArray()为空时,说明设备中没有可供读取的数据,或者在读取过程中出现了错误。2HTTP编程-例子例子:实现简单的应用HTTP协议下载网页的程序。QNetworkAccessManager类用于发送网络请求和接收回复,具体的是用QNetworkRequest类来管理请求,QNetworkReply类进行接收回复,并对数据进行处理。参考代码如下:2HTTP编程-例子Widget.h代码如下:classWidget:publicQWidget{Q_OBJECTpublic:Widget(QWidget*parent=0);~Widget();protected:voidchangeEvent(QEvent*e);private:Ui::Widget*ui;

QNetworkAccessManager*manager;privateslots:

voidreplyFinished(QNetworkReply*);};2HTTP编程-例子Widget.cpp代码如下:Widget::Widget(QWidget*parent):QWidget(parent),ui(newUi::Widget){ui->setupUi(this);this->manager=newQNetworkAccessManager(this);connect(this->manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(replyFinished(QNetworkReply*)));this->manager->")));}voidWidget::replyFinished(QNetworkReply*reply){QTextCodec*codec=QTextCodec::codecForName("GB18030");QStringall=codec->toUnicode(reply->readAll());this->ui->textBrowser->setText(all);reply->deleteLater();}2HTTP编程-例子2功能:在上次例子的根底上,实现下载文件的功能,并能显示下载进度。2HTTP编程-例子2Widget.h代码如下:classWidget:publicQWidget{Q_OBJECTpublic:Widget(QWidget*parent=0);~Widget();voidstartRequest(QUrlurl);//请求链接private:Ui::Widget*ui;QNetworkAccessManager*manager;QNetworkReply*reply;QUrlurl;//存储网络地址QFile*file;//文件指针privateslots:voidon_pushButton_clicked();//下载按钮的单击事件槽函数voidFinished();//完成下载后的处理voidReadyRead();//接收到数据时的处理voidupdateDataReadProgress(qint64,qint64);//更新进度条};2HTTP编程-例子2Widget.cpp代码如下:#include"widget.h"#include"ui_widget.h"#include"QFileInfo"#include"QDebug"#include"QNetworkRequest“Widget::Widget(QWidget*parent):QWidget(parent),ui(newUi::Widget){ui->setupUi(this);this->manager=newQNetworkAccessManager();this->ui->progressBar->hide();}2HTTP编程-例子2Widget.cpp代码如下:voidWidget::on_pushButton_clicked(){url=ui->lineEdit->text();QFileInfoinfo(url.path());QStringfileName(info.fileName()); //获取文件名if(fileName.isEmpty())fileName="index.html"; file=newQFile(fileName);if(!file->open(QIODevice::WriteOnly)){//如果翻开文件失败,那么删除file,并使file指针为0,然后返回qDebug()<<"fileopenerror";deletefile;file=0;return; }startRequest(url);//进行链接请求ui->progressBar->setValue(0);//进度条的值设为0ui->progressBar->show();//显示进度条}2HTTP编程-例子2Widget.cpp代码如下:voidWidget::startRequest(QUrlurl){reply=manager->get(QNetworkRequest(url));//下面关联信号和槽connect(reply,SIGNAL(finished()),this,SLOT(Finished()));//下载完成后connect(reply,SIGNAL(readyRead()),this,SLOT(ReadyRead()));//有可用数据时connect(reply,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(updateDataReadProgress(qint64,qint64)));//更新进度条}voidWidget::ReadyRead(){if(file)file->write(reply->readAll());//如果文件存在,那么写入文件}2HTTP编程-例子2Widget.cpp代码如下:voidWidget::updateDataReadProgress(qint64bytesRead,qint64totalBytes){ui->progressBar->setMaximum(totalBytes);//最大值ui->progressBar->setValue(bytesRead);//当前值}voidWidget::Finished(){ui->progressBar->hide();file->flush();file->close();this->reply->deleteLater();reply=0;deletefile;file=0;}3FTP编程•FTP即FileTransferProtocol,也就是文件传输协议。FTP的主要作用,就是让用户连接上一个远程计算机,查看远程计算机有哪些文件,然后把文件从远程计算机上拷贝到本地计算机,或者把本地计算机的文件送到远程计算机上。在Qt中,我们可以使用QNetworkAccessManager和QNetworkReply类来进行FTP程序的编写。但是,对于较复杂的FTP操作,Qt还提供了QFtp类。

在QFtp中,所有的操作都对应一个特定的函数,我们可以称它们为命令。如connectToHost()连接到效劳器命令,login()登录命令,get()下载命令,mkdir()新建目录命令等。•QFtp类以异步方式工作,所有的这些函数都不是阻塞函数。也就是说,如果一个操作不能立即执行,那么这个函数就会直接返回,直到程序控制权返回Qt事件循环后才真正执行,它们不会影响界面的显示。3FTP编程所有的命令都返回一个int型的编号,使用这个编号让我们可以跟踪这个命令,查看其执行状态。每条命令开始执行时,都会发出commandStarted()信号,该命令执行结束时,会发出commandFinished()信号。可以利用这两个信号和命令的编号来获取命令的执行状态。可以使用currentCommand()获取现在执行的命令,其返回值与命令对应关系如以下图。3FTP编程-例子1•在这个例子中我们从FTP效劳器上下载一个文件并显示出来。3FTP编程-例子1•Widget.h头文件#include<QWidget>#include"QFtp"classWidget:publicQWidget{Q_OBJECTpublic:Widget(QWidget*parent=0);~Widget();protected:voidchangeEvent(QEvent*e);private:Ui::Widget*ui;QFtp*ftp;privateslots:voidftpCommandStarted(int);voidftpCommandFinished(int,bool);};

3FTP编程-例子1•Widget.cpp参考代码Widget::Widget(QWidget*parent):QWidget(parent),ui(newUi::Widget){ui->setupUi(this);ftp=newQFtp(this);ftp->");//连接到效劳器ftp->login();//登录ftp->cd("qt");//跳转到“qt”目录下ftp->get("INSTALL");//下载“INSTALL”文件ftp->close();//关闭连接connect(ftp,SIGNAL(commandStarted(int)),this,SLOT(ftpCommandStarted(int)));//当每条命令开始执行时发出相应的信号connect(ftp,SIGNAL(commandFinished(int,bool)),this,SLOT(ftpCommandFinished(int,bool)));//当每条命令执行结束时发出相应的信号}3FTP编程-例子1•Widget.cpp参考代码voidWidget::ftpCommandStarted(int){if(ftp->currentCommand()==QFtp::ConnectToHost){ui->label->setText(tr("正在连接到效劳器…"));}if(ftp->currentCommand()==QFtp::Login){ui->label->setText(tr("正在登录…"));}if(ftp->currentCommand()==QFtp::Get){ui->label->setText(tr("正在下载…"));}elseif(ftp->currentCommand()==QFtp::Close){ui->label->setText(tr("正在关闭连接…"));}}3FTP编程-例子1•Widget.cpp参考代码voidWidget::ftpCommandFinished(int,boolerror){if(ftp->currentCommand()==QFtp::ConnectToHost){if(error)ui->label->setText(tr("连接效劳器出现错误:%1").arg(ftp->errorString()));elseui->label->setText(tr("连接到效劳器成功"));}if(ftp->currentCommand()==QFtp::Login){if(error)ui->label->setText(tr("登录出现错误:%1").arg(ftp->errorString()));elseui->label->setText(tr("登录成功"));}if(ftp->currentCommand()==QFtp::Get){if(error)ui->label->setText(tr("下载出现错误:%1").arg(ftp->errorString()));else{ui->label->setText(tr("已经完成下载"));ui->textBrowser->setText(ftp->readAll());}}elseif(ftp->currentCommand()==QFtp::Close){ui->label->setText(tr("已经关闭连接"));}}3FTP编程-例子2•该例子将例子1程序进行扩展,使其可以浏览并能下载效劳器上的所有文件。实现在用户填写完相关信息后,按下“连接”按钮,就可以连接到FTP效劳器,并在TreeWidget中显示效劳器上的所有文件,我们可以按下“下载”按钮来下载选中的文件,并使用进度条显示下载进度3FTP编程-例子2privateslots:voidon_downloadButton_clicked();voidon_cdToParentButton_clicked();voidon_connectButton_clicked();voidftpCommandFinished(int,bool);voidftpCommandStarted(int);voidupdateDataTransferProgress(qint64,qint64);//更新进度条voidaddToList(constQUrlInfo&urlInfo);//将效劳器上的文件添加到TreeWidget中voidprocessItem(QTreeWidgetItem*,int);//双击一个目录时显示其内容};Widget.h代码如下:#include<QWidget>#include"QUrlInfo"#include"QTreeWidgetItem"#include"QFtp“#include”QFile”classWidget:publicQWidget{Q_OBJECTpublic:Widget(QWidget*parent=0);~Widget();protected:voidchangeEvent(QEvent*e);private:Ui::Widget*ui;QHash<QString,bool>isDirectory;QStringcurrentPath;QFtp*ftp;QFile*file;3FTP编程-例子2Widget.cpp代码如下:#include"widget.h"#include"ui_widget.h"#include"QFtp"#include"QPixmap"#include"QFile"Widget::Widget(QWidget*parent):QWidget(parent),ui(newUi::Widget){ui->setupUi(this);ui->progressBar->setValue(0);connect(ui->fileList,SIGNAL(itemActivated(QTreeWidgetItem*,int)),this,SLOT(processItem(QTreeWidgetItem*,int)));//鼠标双击列表中的目录时,我们进入该目录}3FTP编程-例子2Widget.cpp代码如下:voidWidget::on_connectButton_clicked(){ui->fileList->clear();currentPath.clear();isDirectory.clear();ftp=newQFtp(this);connect(ftp,SIGNAL(commandStarted(int)),this,SLOT(ftpCommandStarted(int)));connect(ftp,SIGNAL(commandFinished(int,bool)),this,SLOT(ftpCommandFinished(int,bool)));connect(ftp,SIGNAL(listInfo(QUrlInfo)),this,SLOT(addToList(QUrlInfo)));connect(ftp,SIGNAL(dataTransferProgress(qint64,qint64)),this,SLOT(updateDataTransferProgress(qint64,qint64)));QStringftpServer=this->ui->ftpServerlineEdit->text();QStringuserName=this->ui->userNamelineEdit->text();QStringpassWord=this->ui->passWordlineEdit->text();ftp->connectToHost(ftpServer,21);//连接到效劳器,默认端口号是21ftp->login(userName,passWord);//登录}3FTP编程-例子2Widget.cpp代码如下:voidWidget::ftpCommandStarted(int){if(ftp->currentCommand()==QFtp::ConnectToHost){ui->label->setText(tr("正在连接到效劳器…"));}if(ftp->currentCommand()==QFtp::Login){ui->label->setText(tr("正在登录…"));}if(ftp->currentCommand()==QFtp::Get){ui->label->setText(tr("正在下载…"));}elseif(ftp->currentCommand()==QFtp::Close){ui->label->setText(tr("正在关闭连接…"));}}3FTP编程-例子2Widget.cpp代码如下:voidWidget::ftpCommandFinished(int,boolerror){if(ftp->currentCommand()==QFtp::Login){if(error)ui->label->setText(tr("登录出现错误:%1").arg(ftp->errorString()));else{ui->label->setText(tr("登录成功"));this->ftp->list();}}if(ftp->currentCommand()==QFtp::Get){if(error)ui->label->setText(tr("下载出现错误:%1").arg(ftp->errorString()));else{ui->label->setText(tr("已经完成下载"));this->ui->downloadButton->setEnabled(true); this->file.close();}}if(ftp->currentCommand()==QFtp::List){if(isDirectory.isEmpty()){//如果目录为空,显示“empty”ui->fileList->addTopLevelItem(newQTreeWidgetItem(QStringList()<<tr("<empty>")));ui->fileList->setEnabled(false);ui->label->setText(tr("该目录为空"));}}}3FTP编程-例子2Widget.cpp代码如下:voidWidget::processItem(QTreeWidgetItem*item,int){QStringname=item->text(0);//返回第0列的文本值if(isDirectory.value(name)){//如果这个文件是个目录,那么翻开ui->fileList->clear();isDirectory.clear();currentPath+='/';currentPath+=name;ftp->cd(name);ftp->list();ui->cdToParentButton->setEnabled(true);}}3FTP编程-例子2Widget.cpp代码如下:voidWidget::on_cdToParentButton_clicked(){ui->fileList->clear();isDirectory.clear();currentPath=currentPath.left(currentPath.lastIndexOf('/'));if(currentPath.isEmpty()){ui->cdToParentButton->setEnabled(false);ftp->cd("/");}else{ftp->cd(currentPath);}ftp->list();}voidWidget::on_downloadButton_clicked(){QStringfileName=ui->fileList->currentItem()->text(0);this->file=newQFile(fileName);if(!file->open(QIODevice::WriteOnly)){deletefile;return;}ui->downloadButton->setEnabled(false);//下载按钮不可用,等下载完成后才可用

ftp->get(ui->fileList->currentItem()->text(0),file);}3FTP编程-例子2Widget.cpp代码如下:voidWidget::addToList(constQUrlInfo&urlInfo){ QTreeWidgetItem*item=newQTreeWidgetItem;item->setText(0,urlI());item->setText(1,QString::number(urlInfo.size()));item->setText(2,urlInfo.owner());item->setText(3,urlInfo.group());item->setText(4,urlInfo.lastModified().toString("MMMddyyyy"));QPixmappixmap(urlInfo.isDir()?"../dir.png":"../file.png");item->setIcon(0,pixmap);isDirectory[urlI()]=urlInfo.isDir();//存储该路径是否为目录的信息

ui->fileList->addTopLevelItem(item);if(!ui->fileList->currentItem()){ui->fileList->setCurrentItem(ui->fileList->topLevelItem(0));ui->fileList->setEnabled(true);}}voidWidget::updateDataTransferProgress(qint64readBytes,qint64totalBytes){ui->progressBar->setMaximum(totalBytes);ui->progressBar->setValue(readBytes);}4获取本机网络信息•如果要获取自己电脑的IP地址以及其他网络信息。会涉及到网络模块〔QtNetworkModule〕中的QHostInfo,QHostAddress,QNetworkInterface和QNetworkAddressEntry等类。〔1〕使用QHostInfo获取主机名和IP地址获取主机名字:QHostInfo::localHostName()获取IP地址: QHostInfoinfo=QHostInfo::fromName(localHostName); qDebug()<<”IPAddress:“<<info.addresses();〔2〕通过QNetworkInterface类来获取本机的IP地址和网络接口信息QNetworkInterface类提供了程序所运行时的主机的IP地址和网络接口信息的列表。在每一个网络接口信息中都包含了0个或多个IP地址,而每一个IP地址又包含了和它相关的子网掩码和播送地址,它们三者被封装在一个QNetworkAddressEntry对象中。网络接口信息中也提供了硬件地址信息。4获取本机网络信息•QList<QNetworkInterface>list=QNetworkInterface::allInterfaces();//获取所有网络接口的列表foreach(QNetworkInterfaceinterface,list)//遍历每一个网络接口{qDebug()<<"Device:"<<();//设备名qDebug()<<"HardwareAddress:"<<interface.hardwareAddress();//硬件地址QList<QNetworkAddressEntry>entryList=interface.addressEntries();//获取IP地址条目列表,每个条目中包含一个IP地址,一个子网掩码和一个播送地址foreach(QNetworkAddressEntryentry,entryList)//遍历每一个IP地址条目{qDebug()<<"IPAddress:"<<entry.ip().toString();//IP地址qDebug()<<"Netmask:"<<mask().toString();//子网掩码qDebug()<<"Broadcast:"<<entry.broadcast().toString();//播送地址}}4获取本机网络信息•常用的获取IP地址的方法:QStringWidget::getIP()

//获取ip地址

{

QList<QHostAddress>list=QNetworkInterface::allAddresses();

foreach(QHostAddressaddress,list)

{

if(tocol()==QAbstractSocket::IPv4Protocol)

returnaddress.toString();

}

return0;

}5UDP编程•UDP〔UserDatagramProtocol即用户数据报协议〕是一个轻量级的,不可靠的,面向数据报的无连接协议。腾讯QQ,其聊天时就是使用UDP协议进行消息发送的。就像QQ那样,当有很多用户,发送的大局部都是短消息,要求能及时响应,并且对平安性要求不是很高的情况下使用UDP协议。在Qt中提供了QUdpSocket类来进行UDP数据报〔datagrams〕的发送和接收。这里我们还要了解一个名词Socket,也就是常说的“套接字”。Socket简单地说,就是一个IP地址加一个port端口。因为我们要传输数据,就要知道往哪个机子上传送,而IP地址确定了一台主机,但是这台机子上可能运行着各种各样的网络程序,我们要往哪个程序中发送呢?这时就要使用一个端口来指定UDP程序。所以说,Socket指明了数据报传输的路径。5UDP编程•例子:编写两个程序,一个用来发送数据报,可以叫做客户端;另一个用来接收数据报,可以叫做效劳器端,它们均应用UDP协议。这样也就构成了所谓的C/S〔客户端/效劳器〕编程模型。客户端的界面如以下图:5UDP编程•“开始播送”按钮的单击事件槽函数:voidWidget::on_pushButton_clicked()

//发送播送{

QByteArraydatagram=“helloworld!”;

sender->writeDatagram(datagram.data(),datagram.size(),

QHostAddress::Broadcast,45454);}这里我们定义了一个QByteArray类型的数据报datagram,其内容为“helloworld!”。然后使用QUdpSocket类的writeDatagram()函数来发送数据报,这个函数有四个参数,分别是数据报的内容,数据报的大小,主机地址和端口号。对于数据报的大小,它根据平台的不同而不同,但是这里建议不要超过512字节。这里我们使用了播送地址QHostAddress::Broadcast,这样就可以同时给网络中所有的主机发送数据报了。对于端口号,它是可以随意指定的,但是一般1024以下的端口号通常属于保存端口号,所以我们最好使用大于1024的端口,最大为65535。我们这里使用了45454这个端口号,一定要注意,在下面要讲的效劳器程序中,也要使用相同的端口号。5UDP编程•效劳器端的界面如以下图:receiver=newQUdpSocket(this);receiver->bind(45454,QUdpSocket::ShareAddress);connect(receiver,SIGNAL(readyRead()),this,SLOT(processPendingDatagram()));构造函数中将receiver绑定到45454端口,这个端口就是上面发送端设置的端口,二者必须一样才能保证接收到数据报。我们这里使用了绑定模式QUdpSocket::ShareAddress,它说明其他效劳也可以绑定到这个端口上。当receiver发现有数据报到达时就会发出readyRead()信号,将其和数据报处理函数相关联。5UDP编程•voidWidget::processPendingDatagram()//处理等待的数据报{while(receiver->hasPendingDatagrams())//拥有等待的数据报

{QByteArraydatagram;//拥于存放接收的数据报

datagram.resize(receiver->pendingDatagramSize());//让datagram的大小为等待处理的数据报的大小,这样才能接收到完整的数据

receiver->readDatagram(datagram.data(),datagram.size());//接收数据报,将其存放到datagram中

ui->label->setText(datagram);//将数据报内容显示出来

}}5UDP编程•先运行效劳器端程序,再运行客户端程序。然后点击其上的“发送播送”按钮,这时会显示数据报的内容。可以看到,UDP的应用是很简单的。我们只需要在发送端执行writeDatagram()函数进行数据报的发送,然后在接收端绑定端口,并关联readyRead()信号和数据报处理函数即可。改程序运行效果如以下图:5UDP编程•例子:聊天程序:5UDP编程•参考代码如下:Widget.hclassWidget:publicQWidget{Q_OBJECTpublic:Widget(QWidget*parent=0);~Widget();voidsendmessage();QStringgetIP();QStringgetmessage();protected:voidchangeEvent(QEvent*e);private:Ui::Widget*ui;QUdpSocket*udpsocket;privateslots:voidon_SendpushButton_clicked();voidprocesspendingdatagram();};5UDP编程•参考代码如下:Widget.cppWidget::Widget(QWidget*parent):QWidget(parent),ui(newUi::Widget){ui->setupUi(this);this->ui->lineEdit->setFocus();this->udpsocket=newQUdpSocket(this);this->udpsocket->bind(45454,QUdpSocket::ShareAddress|QUdpSocket::ReuseAddressHint);connect(this->udpsocket,SIGNAL(readyRead()),this,SLOT(processpendingdatagram()));}5UDP编程•参考代码如下:Widget.cppvoidWidget::on_SendpushButton_clicked(){sendmessage();}voidWidget::sendmessage(){QByteArraydata;QDataStreamout(&data,QIODevice::WriteOnly);QStringlocalhostname=QHostInfo::localHostName();QStringaddress=this->getIP();out<<localhostname<<address<<getmessage();this->udpsocket->writeDatagram(data,data.length(),QHostAddress::Broadcast,45454);}5UDP编程•参考代码如下:Widget.cppQStringWidget::getIP(){QList<QHostAddress>list=QNetworkInterface::allAddresses();foreach(QHostAddressaddress,list){if(tocol()==QAbstractSocket::IPv4Protocol)

returnaddress.toString();}return0;}QStringWidget::getmessage()//获得要发送的信息{QStringmsg=this->ui->lineEdit->text();ui->lineEdit->clear();ui->lineEdit->setFocus();returnmsg;}5UDP编程•参考代码如下:Widget.cppvoidWidget::processpendingdatagram(){while(this->udpsocket->hasPendingDatagrams()){QByt

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论