首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > QT开发 >

初学QT的TCP编程,有几点不明白。该怎么处理

2012-08-17 
初学QT的TCP编程,有几点不明白。。我是完全复制书上的程序的,虽然能运行成功了,但是代码中有几个地方不明白。

初学QT的TCP编程,有几点不明白。。
我是完全复制书上的程序的,虽然能运行成功了,但是代码中有几个地方不明白。。求求解。。
我不知道该怎么表达我想问的问题,只好把所有的程序粘贴出来,然后加些注释。。。
程序如下:

C/C++ code
#ifndef SERVER_H#define SERVER_H#include <QtNetwork>#include "tcpclientsocket.h"class Server : public QTcpServer{    Q_OBJECTpublic:    Server(QObject *parent = 0,int port=0);    QList<TcpClientSocket*> tcpClientSocketList;   [color=#FF0000] //这个尖括号代表什么意思??[/color]signals:    void updateServer(QString,int);public slots:    void updateClients(QString,int);    void slotDisconnected(int);protected:    void incomingConnection(int socketDescriptor);};#endif

C/C++ code
#include "server.h"Server::Server(QObject *parent,int port)    :QTcpServer(parent){    listen(QHostAddress::Any,port);}void Server::incomingConnection(int socketDescriptor){    TcpClientSocket *tcpClientSocket = new TcpClientSocket(this);    connect(tcpClientSocket,SIGNAL(updateClients(QString,int)),this,SLOT(updateClients(QString,int)));    [color=#FF0000]//上面的那个为什么信号和槽是一样的??[/color]    connect(tcpClientSocket,SIGNAL(disconnected(int))         ,this,SLOT(slotDisconnected(int)));    tcpClientSocket->setSocketDescriptor(socketDescriptor);    tcpClientSocketList.append(tcpClientSocket);}void Server::updateClients(QString msg, int length){    emit updateServer(msg,length);[color=#FF0000]//没有函数定义,那它怎么成为信号的??[/color]    for(int i  = 0;i < tcpClientSocketList.count();i++)    {        QTcpSocket *item = tcpClientSocketList.at(i);        if(item->write(msg.toLatin1(),length) != length)[color=#FF0000]//这句有什么用,我觉得没啥用好像多余的[/color]        {                                               [color=#FF0000]//直接item->write(msg.toLatin1(),length)不就行了吗??[/color]            continue;        }    }}void Server::slotDisconnected(int descriptor){    for(int i  = 0;i < tcpClientSocketList.count();i++)    {        QTcpSocket *item = tcpClientSocketList.at(i);        if(item->socketDescriptor() == descriptor)        {            tcpClientSocketList.removeAt(i);            continue;        }    }}

#ifndef TCPCLIENTSOCKET_H
#define TCPCLIENTSOCKET_H
#include <QtGui>
#include <QtNetwork>
class TcpClientSocket : public QTcpSocket
{
  Q_OBJECT
public:
  TcpClientSocket(QObject *parent = 0);
  ~TcpClientSocket();
signals:
  void updateClients(QString,int);
  void disconnected(int);
protected slots:
  void dataReceived();
  void slotDisconnected();
};
#endif // TCPCLIENTSOCKET_H
C/C++ code
#include "tcpserver.h"TcpClientSocket::TcpClientSocket(QObject *parent){    connect(this,SIGNAL(readyRead())   ,this,SLOT(dataReceived()));    connect(this,SIGNAL(disconnected()),this,SLOT(slotDisconnected()));}TcpClientSocket::~TcpClientSocket(){}void TcpClientSocket::dataReceived(){   while(bytesAvailable() > 0)    {        char buf[1024];        int length = bytesAvailable();        read(buf,length);        QString msg = buf;[color=#FF0000]//这两条有什么用??都没有执行的函数的?是不是只是提醒的作用而已??[/color]        emit updateClients(msg,length);    }}void TcpClientSocket::slotDisconnected(){   emit disconnected(this->socketDescriptor());[color=#FF0000]//这条同上~~不明白~[/color]}

C/C++ code
#ifndef TCPSERVER_H#define TCPSERVER_H#include <QtGui>#include <QtNetWork>#include "server.h"class TcpServer : public QDialog{    Q_OBJECTpublic:    TcpServer(QWidget *parent = 0,Qt::WindowFlags f = 0);    ~TcpServer();public:    QListWidget *ListWidgetContent;    QLabel      *LabelPort;    QLineEdit   *LineEditPort;    QPushButton *pushButtonCreate;    int port;    Server *server;public slots:    void slotCreateServer();    void updateServer(QString,int);};#endif // TCPSERVER_H 


C/C++ code
#include "tcpserver.h"TcpServer::TcpServer(QWidget *parent,Qt::WindowFlags f)    : QDialog(parent,f){    setWindowTitle(tr("TCP Server"));    QVBoxLayout *vbMain = new QVBoxLayout( this );    ListWidgetContent = new QListWidget( this);    vbMain->addWidget( ListWidgetContent );    QHBoxLayout *hb = new QHBoxLayout( );    LabelPort = new QLabel( this );    LabelPort->setText(tr("Port:"));    hb->addWidget( LabelPort );    LineEditPort = new QLineEdit(this);    hb->addWidget( LineEditPort );    vbMain->addLayout(hb);    pushButtonCreate = new QPushButton( this);    pushButtonCreate->setText( tr( "Create" ) );    vbMain->addWidget( pushButtonCreate );    connect(pushButtonCreate,SIGNAL(clicked()),this,SLOT(slotCreateServer()));    port = 8010;    LineEditPort->setText(QString::number(port));}TcpServer::~TcpServer(){}void TcpServer::slotCreateServer(){    server = new Server(this,port);    connect(server,SIGNAL(updateServer(QString,int)),SLOT(updateServer(QString,int)));    [color=#FF0000]//上面信号为什么和槽的都是一样的??这样代表什么意思??[/color]    pushButtonCreate->setEnabled(false);}void TcpServer::updateServer(QString msg, int length){    ListWidgetContent->addItem(msg.left(length));}


[解决办法]
这个尖括号代表 :c++ 的泛型应用。表示放到QList是那种类。
上面的那个为什么信号和槽是一样的:可以一样的,信号和槽位于不同的类里。

emit updateServer(msg,length);//没有函数定义,那它怎么成为信号的??[/color]
在这个位置Server里已经定义,
signals:
void updateServer(QString,int);

QString msg = buf;//这两条有什么用??都没有执行的函数的?是不是只是提醒的作用而已??
 emit updateClients(msg,length);
调用了void Server::updateClients(QString msg, int length) 这个槽

 emit disconnected(this->socketDescriptor());//这条同上~~不明白~
这个地方感觉循环调用了。
[解决办法]
添加到QList之前,应该已经实例化了。不需要在实例化了。


 incomingConnection(int socketDescriptor) 在新连接的时候框架调用的。帮助说的很明白了。
This virtual function is called by QTcpServer when a new connection is available
[解决办法]
探讨
引用:

这个尖括号代表 :c++ 的泛型应用。表示放到QList是那种类。
上面的那个为什么信号和槽是一样的:可以一样的,信号和槽位于不同的类里。

emit updateServer(msg,length);//没有函数定义,那它怎么成为信号的??[/color]
在这个位置Server里已经定义,
signals:
void updateServer(QStr……

热点排行