技术天地

英创Linux主板Qt网络应用程序简介    发布时间:2014-5-29    被阅览数:

  在Linux中的网络编程是通过socket接口来进行的。我们常说的socket接口是一种特殊的I/O,它也是一种文件描述符,关于socket编程的应用可以参考英创公司光盘中使用必读的相关内容。

 

  现在在英创公司提供的例程Step3_TCPServe基础上,加入Qt显示单元,使其能通过显示屏进行操作,基本的思想是还是利用Qt的信号和插槽机制进行对象间的通讯,当接收到的数据的时候,发出Signal,Qt 的事件循环中接收到这个信号,调用定义好的Slot显示接收到的数据。

 

  Step3_TCPServe是一个支持多个客户端的连接TCPServer示例,该例程采用了面向对象的C++编程,创建了CTCPServer和CTCPCustom两个类,其中CTCPServer类负责侦听客户端的连接,一旦有客户端请求连接,它就负责接受此连接,并创建一个新的CTCPCustom类对象与客户端进行通讯,然后CTCPServer类接着监听客户端的连接请求,所以需要让CTCPServer类和CTCPCustom类继承QObject类的属性,使QObject成为CTCPServer类和CTCPCustom类的基类,然后在CTCPServer类和CTCPCustom类中各加入一个signal,让CTCPServer类和CTCPCustom类的信号关联,这样当CTCPCustom类发出信号CTCPServer类也会发出信号,再让CTCPServer类的信号和Qt显示通过信号和插槽的机制连接,但是对于网络通信的操作部分并不用做修改,原理如下图:

 

 

  继承QObject类的属性,加入信号和槽的方法在《英创Linux主板Qt串口应用程序简介》中有较详细的说明,在CTCPCustom类中,添加的方法也一样,当判断接收到数据时,发送信号,添加程序:

  emit pSocket->readyRead(pSocket->RecvBuf);

 

  在前面提到,在CTCPServer类中,当判断有客户端请求连接时,会创建一个CTCPCustom类对象与客户端进行通讯,这时再将CTCPServer类和CTCPCustom类的信号关联:

  connect(pClientSocket,SIGNAL(readyRead(QString)),pSocket,SIGNAL(readyRead(QString)));

 

  在Qt中,将两个信号关联,如同上面那样,当pSocket中的信号发送时,pClientSocket中的信号也会跟着发送。

 

  最后在显示窗口Widget类中,将CTCPServer类的信号和显示槽函数关联:

  connect(m_TCPServer,SIGNAL(readyRead(QString)),this,SLOT(readData(QString)),Qt::QueuedConnection);

 

  然后可以在显示界面中添加了一些其他功能组件,比如按钮等,然后编写组件的事件响应函数,实现想要的功能,在本例程中,添加了一些按钮和显示,用来选择启动TCPServer,显示IP和端口号等,部分实现代码如下:

 

  void Widget::on_startpushButton_clicked() //侦听按钮
  {
    char buff_1[16],buff_2[16];
    m_TCPServer=new CTCPServer;
    m_TCPServer->m_LocalPort = 1001;
    if((m_TCPServer->Open())<0)
    {
      QMessageBox::information(this,tr('错误'),tr('创建失败'),QMessageBox::Yes);
      delete m_TCPServer;
      return;
    }
    connect(m_TCPServer,SIGNAL(readyRead(QString)),this,SLOT(readData(QString)),Qt::QueuedConnection); //关联信号和槽
    ui->startpushButton->setEnabled(false);
    ui->textBrowser_3->setEnabled(true);
    QString s=QString::number(m_TCPServer->m_LocalPort,10);
    ui->textBrowser_3->insertPlainText(s); //显示端口号
    ui->textBrowser_2->setEnabled(true);
    if((m_TCPServer->get_inetip('eth0',buff_1))==0)
    {
      //显示eth0的IP地址
      ui->textBrowser_2->append( QString(QLatin1String(buff_1)));
    }
    if((m_TCPServer->get_inetip('eth1',buff_2))==0)
    {
      //显示eth1的IP地址
      ui->textBrowser_2->append( QString(QLatin1String(buff_2)));
    }
    ui->closepushButton->setEnabled(true);
  }

 

  最后在工程中添加main.cpp,在main函数中,主要是对字体进行设置,并且显示我们设计的窗口:

 

  int main( int argc,char* argv[] )
  {
    QApplication a(argc, argv);
    QFont font('simsun',9,QFont::Bold); //设置字体
    QTextCodec::setCodecForTr(QTextCodec::codecForName('utf8'));
    a.setFont(font);
    Widget w;
    w.show();
    return a.exec(); //返回Qt事件循环
  }

 

  程序运行效果:

 

 

  本案例程序源码下载

Go Top