Qt初体验
Posted raidenmei
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt初体验相关的知识,希望对你有一定的参考价值。
QT初体验(二)
1.窗口跳转
想到窗口跳转的实现方式,应该很容易想到新建打开新的窗口,然后关闭当前窗口
首先我们得新建一个窗口的类,然后在当前类中创建这个类的对象,调用Show()函数显示出新窗口,close()函数关闭当前窗口
实现的方式大概就是下面这个样子:
ui2 = new Select(); ui2->show(); this->close();
接下来说一下创建新的窗口类的方法:
选择widget,添加
注意,这里只会给你生成一个.ui文件,而.h和.cpp则需要自己再去创建,也就是说再添加一个类(添加类的方法就不再赘述),名字和这个最好保持一致
接下来就是给自己添加好头文件之类的,因为这个是不会给你写的,有几个需要注意的是:
-
ui_xxx.h头文件,这个需要你先把.ui文件编译一下(右键点击),然后重开一下VS才可以识别(当然不在意那些红杠杠的话可以不用在意2333)
-
继承类这样的照着写就可以了,然后这个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的生命周期大致如下:
- 创建socket。
- 绑定(bind)地址端口
- 监听网络连接
- 接受连接
- 关闭连接
clinet的生命周期则稍微简单点:
- 创建socket
- 绑定地址
- 发起连接
- 关闭连接
下面来讲一下具体的使用
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初体验的主要内容,如果未能解决你的问题,请参考以下文章