码迷,mamicode.com
首页 > 其他好文 > 详细

Qt初体验(二)

时间:2018-10-18 23:58:46      阅读:327      评论:0      收藏:0      [点我收藏+]

标签:widget   extern   电脑   ati   读取   read   cli   www.   tail   

QT初体验(二)

1.窗口跳转

  想到窗口跳转的实现方式,应该很容易想到新建打开新的窗口,然后关闭当前窗口

  首先我们得新建一个窗口的类,然后在当前类中创建这个类的对象,调用Show()函数显示出新窗口,close()函数关闭当前窗口

  实现的方式大概就是下面这个样子:

ui2 = new Select();
ui2->show();
this->close();

  接下来说一下创建新的窗口类的方法:

  技术分享图片

  技术分享图片

  选择widget,添加

  注意,这里只会给你生成一个.ui文件,而.h和.cpp则需要自己再去创建,也就是说再添加一个类(添加类的方法就不再赘述),名字和这个最好保持一致

  接下来就是给自己添加好头文件之类的,因为这个是不会给你写的,有几个需要注意的是:

  1. 技术分享图片

      ui_xxx.h头文件,这个需要你先把.ui文件编译一下(右键点击),然后重开一下VS才可以识别(当然不在意那些红杠杠的话可以不用在意2333)

  2. 技术分享图片

    继承类这样的照着写就可以了,然后这个Q_OBJECT是一定一定一定要写的,因为Q_OBJECT相当于是一个宏定义,里面包含了很多QT的函数,如果没有这个,这个窗口就是一死窗口,没有任何功能,任何关于这个有一点需要注意的是这个需要一个moc_xxx.cpp文件,可以先去项目的文件夹中找找,如果没有可以按https://blog.csdn.net/sunxiaoju/article/details/48316271中的方法解决

    技术分享图片

  大概是这样的目录下吧 

  3.窗口循环(互相)跳转

    比如说我从A窗口->B窗口,再从B窗口->A窗口,这样的话,按我们上面的方法,那么A.h中一定会包含B.h,B.h中也一定会包含A.h,这样的话在预处理阶段,头文件写入的时候就会进入死循环,这时候也就需要用到另外的声明方式extern,https://blog.csdn.net/xiqingnian/article/details/41214539,大致上可以去看这篇博客,里面的strong没什么用...,看看extern的格式就好,也可以去了解extern的其他用法,比如共享变量?我也不知道该怎么说...就是一个文件中的变量,让它在其他的文件中也可以使用,并能修改 保留值。

  新建窗口实现跳转大概也就是这样的过程吧

 2.利用QTcpSocket类和QTcpServer类实现简单的客户端和服务器之间的通信

    首先我们来了解一下socket通信的流程(以下内容我不一定能解释清楚...大概知道原理以及怎么用...毕竟计算机网络我还没有学...)

     技术分享图片

  

  上图中的左边是clinet,右边是server。

  server的生命周期大致如下:

  1. 创建socket。
  2. 绑定(bind)地址端口
  3. 监听网络连接
  4. 接受连接
  5. 关闭连接

  clinet的生命周期则稍微简单点:

  1. 创建socket
  2. 绑定地址
  3. 发起连接
  4. 关闭连接

  下面来讲一下具体的使用

  1)服务器

  首先是服务器的,我们先初始化QTcpServer和QTcpSocket类的对象

    this->tcpServer = new QTcpServer(this);
    this->tcpSocket = new QTcpSocket(this);

  接下来利用QT的connect函数连接server和acceptConnection函数

connect(tcpServer, SIGNAL(newConnection()), this, SLOT(acceptConnection()));

   emmm,这段代码的意思就是在tcpServer接受到newConnection信号之后执行acceptConnection函数,也就是接收到新的连接请求就接受连接,acceptConnection函数如下:

void Server::acceptConnection()
{
	tcpSocket = tcpServer->nextPendingConnection();
	connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(receiveData()));  
}

  这段代码的意思就是获取tcp连接,然后赋值给tcpSocket,然后把Socket和receiveData函数连接起来,在接受到readyRead信号之后执行receiveData函数,receiveData函数(需要自己写,也不一定要叫这个名字)则是接收信息之后的处理函数(看自己的需求),我只简单的用到了readAll和write函数,分别是读取和发送,用法可以参考下面的代码

QString data = tcpSocket->readAll();
QString sendData;
tcpSocket->write(sendData.toLatin1());

  sendData就是服务器发送给客户端的信息,具体是什么看自己的需求

  回到正轨,光只是设计好连接还不够,上面的listen(监听并没有实现),下面是监听的方式

tcpServer->listen(QHostAddress::Any, 8000)

  listen函数两个参数分别是ip和端口,ip就可以利用这个函数来获取,后面的端口则自己选择(大于5000应该就可以了)

  到这里服务器的解释就结束了,下面是客户端的

  2)客户端

  客户端的相对服务器要做的准备要少一点

  第一步,初始化Socket,方式和服务器一样

  第二步,取消当前连接,连接服务器

tcpSocket->abort();   //取消已有的连接
tcpSocket->connectToHost(ip, port);
connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readMessages()));

  第三步,发送接收信息,这个与服务器也是一样的,readAll和write函数即可

3.程序打包

  由于调用了QT的库,所以要在别的电脑上也能运行的话(64位在32位电脑上还是不行的...不要问我为什么知道...),可以利用Qt的打包工具进行打包,详情可以参考这篇博客https://blog.csdn.net/q651742112/article/details/78167059?locationNum=6&fps=1

  

  这次结对编程项目的收获基本总结完毕,感谢助教的帮助以及前辈们的总结,让我在做学习的路上少走了很多弯路

  关于socket方面主要参考的三篇篇博客:

  https://blog.csdn.net/u011964923/article/details/64923685

  https://blog.csdn.net/tianya_team/article/details/72566198

  https://www.jianshu.com/p/3f42172f582b

  再次感谢

 

  

  

 

Qt初体验(二)

标签:widget   extern   电脑   ati   读取   read   cli   www.   tail   

原文地址:https://www.cnblogs.com/raidenmei/p/9813381.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!